From 4f99a585b0e9ed2d6c1c63b3dc1cfab75f5c50f2 Mon Sep 17 00:00:00 2001 From: EdwardW2 <44901854+EdwardW2@users.noreply.github.com> Date: Mon, 10 May 2021 14:39:05 +0100 Subject: [PATCH] [MOB-3216] Update master (#111) * Update KarhooPaymentView and make it public (#62) * Update KarhooPaymentView and make it public * Add UIView extensions * Add UIView extensions functions to the existing one * [MOB-2976] Quote polling fix (#72) * Merge develop, update pods * no message * handle quote polling * Revert pods to point back to develop. * no message * no message * no message * MOB-2949 - Driver allocation delay alert (#73) * Show alert on driver allocation delay * Show Ride Details and not Rides List screen * Add tests * Remove extra . from text * identifier added (#75) Co-authored-by: Nurseda Balcioglu * CircleCI update (#74) * Update with userLogin and config auth * Move userLogin from Keys to ViewController * Delete userLogin from Keys * Move config settings setup to ViewController * Use local userLogin * Update with additional keys * Update keys * Set auth config * Update keys * Extract KarhooConfig * Remove echo of KarhooConfig * Re-add MockTripAllocationView * Re-add MockTripAllocationView * Re-add KarhooAddressSearchBarPresenterSpec * Re-add CurrencyCodeConverterSpec * Re-add MockAlertHandler * Re-add MockQuoteSorter * Re-add AdyenCardRegistrationFlowSpec * Re-add MockQuoteSorter * Re-add MockAddressBarView * Re-add MockQuoteSorter again * Re-add MockAddressMapView * MockQuoteSorter again * Re-add // * Re-add MockQuoteSorter * MockQuoteSorter for a change * Add MockQuoteSorter * Change import order * Changed MockQuoteSorter encoding * Add in Build Phase * Move MockQuoteSorter into KarhooQuoteListPresenterSpec * Move UnitTestSetup * Revert to old MockQuoteSorter * Add space * Update to use env variable instead of echo * Update fastlane version * Update bundler * Update tabbing * Update bundler * Use one line command * Use --decode * Add team id * Point to circleci_fix branch * Revert to point to develop * CircleCI Fix (#76) * Point to SDK fix branch * Point to cart update branch * Update to develop * Update to use $(inherited) * Clean up lanes * Move test target out of main target * Rename lane * Fastlane scan * Use FASTLANE_LANE_TEST * Move target back * Use bundle exec * Move install step * Update fastlane and search_path * Delete output params * Updated to remove params * Add scan params * Delete Client target from tests * Updated the test target * Ignore linting * Add device back * Move to Fastfile * Update to search_paths * Tweak xcov * Use bundle exec command * Add output * Update fastlane * Update output name * Use workspace * Comment out xcov for now * Rename to skip flaky test * Update Slack message text * Mob 3171 remove unused strings (#77) * Remove unused strings from UI SDK * Add ErrorKarhoo to showAlert methods * MOB-3143 - Contact button refactoring (#79) * Very basic initial stab at using common StackButtons in Trip Screen. * Cancel ride plugged in * Changed show/hide button display constraints * Delete redundant code * Kind of working but needs tweaking to display properly * Update dropdown button constraint * Try spacing * Fix stack button resizing * More or less working but needs padding fix * Remove spacing and change size of drop down button * Delete unused voice * Make var private * Prefill passenger details for token exchange (#78) * Prefill passenger details for token exchange * use existing utility method PassengerInfo.shared.currentUserAsPassenger() * MOB-3144 - Display cancellation fee on Trip and Ride Details screens (#80) * Display cancellation fee popup * Initial attempt at getting cancellation fee * Refactor to put fee alert display logic in one place * Dismiss overlay * Put hide overlay in correct place * Call cancelBookingConfirmed * Move trip cancellation logic to CancelRideBehaviour * Remove redundant delegate protocols * Add to handle successful cancellation * Use protocol and get test target compiling but tests still need fixing * Added tests for booking fee retrieval * Added tests for cancel ride behaviour * Added tests for presenters handling cancellation success and remove redundant tests * Delete redundant test * Code review changes to remove redundant vars * MOB-3144 - Add decimal formatting to currency display (#81) * Add decimal formatting to currency display * Update to point at develop * Take user to Rides screen when OK is pressed on the cancel screen (#82) * MOB-3193 - Cancellation SLA (#83) * Take user to Rides screen when OK is pressed on the cancel screen * Added free cancellation info * Added tests for SLA free cancellation minutes * Fix logic for cancellation info display * Remove suffix url parameter from adyen (#84) * Force Adyen 3ds (#85) * Force 3DS on mobile by setting browserInfo * Show Adyen error details * Update podfile * Add SupplyPartnerId to the AdyenPayments request (#86) * Add SupplyPartnerId to the AdyenPayments request * Code review feedback * MOB-3190 - Align Trip & Ride buttons (#87) * Updated ride/trip details buttons to align with Android * Added asserts for click actions * Mob 3205 update quote model use fleet (#88) * Use Quote Fleet model * Update podfile * Handle 3DS callback in Client app (#89) * When possible, show cancellable notification in the booking confirmation screens. (#91) * When possible, show the notification that a ride is cancellable, in the booking confirmation screens. * Remove duplicate cancelation message formatting. * Feature/mob 3194 display cancellation sla in the booking request component (#92) * Prepare cancellation info label for UI testing. * Show free cancellation info in the ride list and details screens (#93) * Do not cut off price information in the quote list (#95) * On small devices * Use nonce from response for Adyen booking (#96) * Add free cancellation message when available before driver en route (#94) * Refactor to use enum cancellation types. (#97) * Task/mob 3184 add linting to iOS builds (#98) * Fix all swiftlint violations & warnings. * Add small swiftlint issue & add swiftlint CircleCI step * Add swiftlint CircleCI job * Fix small swiftlint issue * Add more serious swiftlint issue * Revert "Add more serious swiftlint issue" This reverts commit 70eed309d715f7d74e1af7c5bbe2a6fee842b5dc. * Update SwiftLint pod & solve more swiftlint issues * Include the folder to scan with SwiftLint * fix and refactoring icon size (#100) * fix and refactoring icon size * removed empty lines * Bump kramdown from 2.3.0 to 2.3.1 (#99) Bumps [kramdown](https://github.com/gettalong/kramdown) from 2.3.0 to 2.3.1. - [Release notes](https://github.com/gettalong/kramdown/releases) - [Changelog](https://github.com/gettalong/kramdown/blob/master/doc/news.page) - [Commits](https://github.com/gettalong/kramdown/commits) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Feature/mob 3237 show message when no fleet is available at a time (#101) * Add message when quotes requests are completed with no quotes. TODO: add unit tests (right now the KarhooQuoteListPresenterSpec are not running. * Fix some unit tests * Add padding to the message. Rename function. * Complete the renaming of the function. * Fix/mob 2842 coming back to the app after trip completion signs the user out (#103) * Fix bug which hides the filtering, sorting controls in the quotes list. * Fix bug which closes the booking view after the app goes into the background. * Mob 3226 display cancellation time friendly (#102) * added new TimeFormatter class, plurals localizable files and strings * added stringsdict to podspec * modified TimeFormatter and using it in different parts of the app * added tests for TimeFormatter * podfile * shorter return * [MOB-3181] Fix CircleCI XCov (#104) * Update * no message * CircleCI run xcov * [MOB-3185] Fix test (#106) * Seems like this test doesn't fail anymore * Found the issue * changed price display rules (#105) * changed price display rules * new test and small fix * [MOB-3216] Release 1.5.0 (#109) * Bump versions * no message * Bump nokogiri from 1.10.10 to 1.11.3 (#107) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.10.10 to 1.11.3. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.10.10...v1.11.3) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Make Braintree versions more specific. (#108) Right now, if trying to update, Braintree drop in will install version 9, which is not supported. Co-authored-by: Mostafa Hadian Co-authored-by: Jo Santa Maria <60882714+jsm20@users.noreply.github.com> Co-authored-by: nurito-burrito <44758040+nurito-burrito@users.noreply.github.com> Co-authored-by: Nurseda Balcioglu Co-authored-by: cornelkar <61707821+cornelkar@users.noreply.github.com> Co-authored-by: cosminBadulescu Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .circleci/config.yml | 56 +- .swiftlint.yml | 2 + Client/AppDelegate.swift | 5 + Client/Info.plist | 10 + Client/KarhooConfig.swift | 23 + Client/ViewController.swift | 12 +- Gemfile.lock | 137 +-- KarhooUISDK.podspec | 8 +- KarhooUISDK.xcodeproj/project.pbxproj | 806 +++++++++--------- .../xcschemes/KarhooUISDKTests.xcscheme | 23 - .../Builders/TripSummaryScreenBuilder.swift | 2 +- KarhooUISDK/Classes/CancelRideBehaviour.swift | 95 ++- .../AddCard/AdyenCardRegistrationFlow.swift | 35 +- .../AddCard/AdyenResponseHandler.swift | 10 +- .../BraintreeCardRegistrationFlow.swift | 7 +- .../AddCard/CardRegistrationFlow.swift | 1 + .../AdyenPaymentNonceProvider.swift | 1 + .../BraintreePaymentNonceProvider.swift | 7 +- .../NonceProvider/PaymentNonceProvider.swift | 2 +- .../ThreeDSecure/AdyenThreeDSecureUtils.swift | 31 + .../ThreeDSecure/ThreeDSecureProvider.swift | 7 + .../AddressBarMVP/KarhooAddressBarView.swift | 26 +- .../ConstraintSwitcher.swift | 2 +- .../Common/CurrencyCodeConverter.swift | 91 +- KarhooUISDK/Common/DropDownButton.swift | 2 +- .../KarhooTextField/KarhooTextField.swift | 2 +- .../KarhooTextField/KarhooTextField.xib | 8 +- .../KarhooTextInputView.swift | 4 +- KarhooUISDK/Common/KeyboardSizeProvider.swift | 2 +- KarhooUISDK/Common/Layout/Attributes.swift | 8 +- KarhooUISDK/Common/Layout/KarhooColors.swift | 3 + .../MapMVP/AppleMapKit/KarhooMKMapView.swift | 1 + KarhooUISDK/Common/TimeFormatter.swift | 28 + KarhooUISDK/Common/UITexts.swift | 14 +- .../VehicleCapacityView.swift | 8 +- KarhooUISDK/Error/KarhooUISDKError.swift | 4 +- .../KarhooSDKExtensions/FareExt.swift | 2 +- .../KarhooSDKExtensions/TripExt.swift | 4 +- .../UIView+Extensions.swift | 77 ++ KarhooUISDK/Routing/BaseViewController.swift | 23 +- .../AddressScreen/AddressViewController.swift | 29 +- .../KarhooBookingRequestPresenter.swift | 10 +- .../KarhooBookingRequestViewController.swift | 10 +- .../SupplierView/SupplierView.swift | 25 +- .../FormBookingRequestPresenter.swift | 13 +- .../FormBookingRequestViewController.swift | 10 +- .../FormCheckoutHeaderView.swift | 89 +- .../PassengerDetailsMVP.swift | 5 - .../PassengerDetailsView.swift | 15 +- .../Screens/BookingScreen/BookingMVP.swift | 2 + .../KarhooBookingPresenter.swift | 35 +- .../KarhooBookingViewController.swift | 18 +- .../QuoteListEmptyDataSetView.swift | 5 +- .../KarhooQuoteListPresenter.swift | 35 +- .../KarhooQuoteListViewController.swift | 13 +- .../QuoteListMVP/QuoteCell/QuoteView.swift | 36 +- .../QuoteCell/QuoteViewModel.swift | 38 +- .../QuoteListMVP/QuoteListMVP.swift | 2 + .../QuoteListMVP/QuoteListPanelLayout.swift | 4 +- .../KarhooTripAllocationPresenter.swift | 37 +- .../KarhooTripAllocationView.swift | 5 + .../TripAllocationMVP/TripAllocationMVP.swift | 27 +- .../KarhooDatePickerPresenter.swift | 2 +- .../PaymentView/KarhooPaymentPresenter.swift | 7 +- .../PaymentView/KarhooPaymentView.swift | 11 +- .../Rides/RidesList/RideCell/RideCell.swift | 74 +- .../RideCell/RideCellViewModel.swift | 17 + .../KarhooRideDetailsPresenter.swift | 29 +- .../RideDetailsViewController.swift | 6 +- .../RideDetailsStackButtonPresenter.swift | 23 +- .../TripMetaData/KarhooTripMetaDataView.swift | 30 + .../TripMetaData/TripMetaDataViewModel.swift | 36 +- .../RidesList/RidesListViewController.swift | 2 +- .../MenuContentPresenter.swift | 2 +- .../TripScreen/KarhooTripPresenter.swift | 22 +- .../TripScreen/KarhooTripViewController.swift | 4 +- .../KarhooTripDetailsView.swift | 65 +- .../TripActionsView/TripActionsView.swift | 128 --- .../TripDetailsMVP/TripDetailsMVP.swift | 1 - .../TripInfoView/TripInfoView.swift | 71 +- .../TripSummaryViewController.swift | 2 +- .../Base.lproj/Localizable.strings | 50 +- .../en.lproj/Localizable.stringsdict | 38 + .../Translations/es.lproj/Localizable.strings | 45 +- .../es.lproj/Localizable.stringsdict | 38 + .../Translations/fr.lproj/Localizable.strings | 48 +- .../fr.lproj/Localizable.stringsdict | 38 + .../MockTripSummaryScreenBuilder.swift | 2 +- .../Classes/MockCancelRideBehaviour.swift | 13 +- .../Mocks/Classes/MockTripsProvider.swift | 2 +- .../Mocks/Common/MockBaseViewController.swift | 16 +- KarhooUISDKTests/Mocks/PrimitiveUtil.swift | 2 +- .../Routing/MockCardRegistrationFlow.swift | 3 + .../Domain/MockAddressSearchProvider.swift | 2 +- .../QuoteList/MockQuoteListView.swift | 5 + .../MockTripAllocationView.swift | 6 + .../Screen/Trip/MockMapViewActions.swift | 2 - .../Mocks/Screen/UINavigationSpec.swift | 2 +- .../Mocks/Service/MockPaymentService.swift | 4 + KarhooUISDKTests/Mocks/TestUtil.swift | 22 +- .../Common/BaseViewControllerSpec.swift | 5 +- .../Common/CancelRideBehaviourSpec.swift | 179 ++-- .../ResizingSwitcherTests.swift | 8 +- .../Common/CurrencyCodeConverterSpec.swift | 84 +- .../Common/KarhooTripsProviderSpec.swift | 2 +- .../Common/StackButtonViewSpec.swift | 2 +- .../TestCases/Common/TimeFormatterSpec.swift | 86 ++ .../ViewModel/QuoteCellViewModelSpec.swift | 60 +- .../ViewModel/RideCellViewModelSpec.swift | 51 ++ .../ViewModel/TripMetaDataViewModelSpec.swift | 51 ++ .../TestCases/Extension/TripExtSpec.swift | 4 +- .../AdyenCardRegistrationFlowSpec.swift | 35 +- .../KarhooCardRegistrationFlowSpec.swift | 12 +- .../KarhooBookingRequestPresenterSpec.swift | 1 - .../MockBookingRequestView.swift | 9 +- .../BookingAddressBarPresenterSpec.swift | 2 - .../KarhooBookingPresenterSpec.swift | 27 +- ...hooBookingViewController+BuilderSpec.swift | 1 + .../Map/BookingMapPresenterSpec.swift | 2 - .../Map/DestinationSetStrategySpec.swift | 2 - .../Map/PickupOnlyStrategySpec.swift | 4 +- .../KarhooQuoteListPresenterSpec.swift | 63 +- .../KarhooTripAllocationPresenterSpec.swift | 78 +- .../DatePickerPresenterSpec.swift | 2 +- ...rhooGuestBookingRequestPresenterSpec.swift | 31 +- .../KarhooRideDetailsPresenterSpec.swift | 70 +- .../RideDetailsStackButtonPresenterSpec.swift | 56 +- .../TripFeedbackPresenterSpec.swift | 29 +- .../TripDetails/KarhooTripPresenterSpec.swift | 46 +- .../KarhooTripSummaryPresenterSpec.swift | 2 - .../TripSummaryInfoViewModelSpec.swift | 1 - Podfile | 29 +- Podfile.lock | 51 +- fastlane/Fastfile | 22 +- fastlane/README.md | 2 +- fastlane/test_output/UISDKTests.xml | 310 ++++++- 136 files changed, 2895 insertions(+), 1446 deletions(-) create mode 100644 Client/KarhooConfig.swift create mode 100644 KarhooUISDK/Classes/Payment/ThreeDSecure/AdyenThreeDSecureUtils.swift create mode 100644 KarhooUISDK/Common/TimeFormatter.swift delete mode 100644 KarhooUISDK/Screens/TripScreen/TripDetailsMVP/TripActionsView/TripActionsView.swift create mode 100644 KarhooUISDK/Translations/en.lproj/Localizable.stringsdict create mode 100644 KarhooUISDK/Translations/es.lproj/Localizable.stringsdict create mode 100644 KarhooUISDK/Translations/fr.lproj/Localizable.stringsdict create mode 100644 KarhooUISDKTests/TestCases/Common/TimeFormatterSpec.swift diff --git a/.circleci/config.yml b/.circleci/config.yml index 62c970cce..ead3440e7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,20 +3,34 @@ version: 2.1 jobs: + ### Swift lint job + swiftlint: + docker: + - image: dantoml/swiftlint:latest + steps: + - checkout + - run: swiftlint lint --reporter junit | tee swiftlintResults.xml + - store_artifacts: + path: swiftlintResults.xml + - store_test_results: + path: swiftlintResults.xml + + ### Build & test job build-and-test: macos: xcode: 12.0.0 working_directory: /Users/distiller/project/KarhooUISDK.xcworkspace environment: - FL_OUTPUT_DIR: output - FASTLANE_LANE: UISDK_unit_tests + FASTLANE_LANE_TEST: UISDK_unit_tests shell: /bin/bash --login -eo pipefail resource_class: xlarge steps: - checkout - run: name: Set Ruby Version - command: echo 'chruby ruby-2.7.2' >> ~/.bash_profile + command: | + echo 'chruby ruby-2.7.2' >> ~/.bash_profile + gem install bundler:2.2.7 - restore_cache: name: Restore cache - Load installed gems from cache if possible - keys: @@ -38,36 +52,21 @@ jobs: name: Fetch CocoaPods Specs command: | curl https://cocoapods-specs.circleci.com/fetch-cocoapods-repo-from-s3.sh | bash -s cf + - run: + name: Decode Keys.swift + command: + echo "$CLIENT_KEYS" | base64 --decode > Client/Keys.swift - run: name: Install CocoaPods command: | bundle check || bundle install bundle exec pod install --repo-update --verbose - run: - name: Create Keys.swift - command: | - echo "import KarhooSDK" > Client/Keys.swift - echo "import KarhooUISDK" >> Client/Keys.swift - echo "struct Keys {" >> Client/Keys.swift - echo "static let identifier = \"\"" >> Client/Keys.swift - echo "static let referer = \"\"" >> Client/Keys.swift - echo "static let organisationId = \"\"" >> Client/Keys.swift - echo "static let userServiceEmail = \"$ADYEN_TEST_USER\"" >> Client/Keys.swift - echo "static let userServicePassword = \"$USER_SERVICE_PASSWORD\"" >> Client/Keys.swift - echo "static func staging() -> KarhooEnvironment {" >> Client/Keys.swift - echo "return .custom(environment: KarhooEnvironmentDetails(host: \"$ADYEN_STG_HOST\", authHost: \"$ADYEN_STG_AUTHHOST\", guestHost: \"$ADYEN_STG_GUESTHOST\")) }}" >> Client/Keys.swift - echo "let guestSettings = GuestSettings(identifier: Keys.identifier, referer: Keys.referer, organisationId: Keys.organisationId)" >> Client/Keys.swift - echo "class KarhooConfig: KarhooUISDKConfiguration {" >> Client/Keys.swift - echo "func environment() -> KarhooEnvironment {" >> Client/Keys.swift - echo "return Keys.staging() }" >> Client/Keys.swift - echo "func authenticationMethod() -> AuthenticationMethod {" >> Client/Keys.swift - echo "return .karhooUser }}" >> Client/Keys.swift - - run: - name: fastlane - command: bundle exec fastlane UISDK_unit_tests + name: Run unit test + command: bundle exec fastlane $FASTLANE_LANE_TEST - run: name: Fastlane Xcov report - command: fastlane ios XcovReport + command: bundle exec fastlane ios XcovReport # Collect XML test results data to show in the UI, and save the same XML # files under test-results folder in the Artifacts tab @@ -82,19 +81,20 @@ jobs: xcode: 12.0.0 environment: FL_OUTPUT_DIR: output - FASTLANE_LANE: adhoc + FASTLANE_LANE_TEST: UISDK_unit_tests steps: - checkout - run: bundle install - run: name: Fastlane - command: bundle exec fastlane UISDK_unit_tests + command: bundle exec fastlane $FASTLANE_LANE_TEST - store_artifacts: - path: output + path: $FL_OUTPUT_DIR workflows: build-test-adhoc: jobs: + - swiftlint - build-and-test - adhoc: filters: diff --git a/.swiftlint.yml b/.swiftlint.yml index 0e0f1277b..d445f5e0b 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -3,6 +3,8 @@ disabled_rules: trailing_whitespace: ignores_empty_lines: true ignores_comments: true +included: + - KarhooUISDK excluded: - Pods line_length: 200 diff --git a/Client/AppDelegate.swift b/Client/AppDelegate.swift index 359d1a684..f4d48281f 100644 --- a/Client/AppDelegate.swift +++ b/Client/AppDelegate.swift @@ -8,6 +8,7 @@ import KarhooUISDK import KarhooSDK import Braintree +import Adyen @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { @@ -32,6 +33,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate { if url.scheme?.localizedCaseInsensitiveCompare(urlScheme) == .orderedSame { return BTAppSwitch.handleOpen(url, options: options) } + let adyenThreeDSecureUtils = AdyenThreeDSecureUtils() + if url.scheme?.localizedCaseInsensitiveCompare(adyenThreeDSecureUtils.current3DSReturnUrlScheme) == .orderedSame { + return RedirectComponent.applicationDidOpen(from: url) + } return false } } diff --git a/Client/Info.plist b/Client/Info.plist index 753988287..f22b6271f 100644 --- a/Client/Info.plist +++ b/Client/Info.plist @@ -28,6 +28,16 @@ com.karhooUISDK.Client.Payments + + CFBundleTypeRole + Editor + CFBundleURLName + com.karhooUISDK.Client.Adyen + CFBundleURLSchemes + + com.karhooUISDK.Client.Adyen + + CFBundleVersion 1 diff --git a/Client/KarhooConfig.swift b/Client/KarhooConfig.swift new file mode 100644 index 000000000..84e82c32c --- /dev/null +++ b/Client/KarhooConfig.swift @@ -0,0 +1,23 @@ +// +// KarhooConfig.swift +// Client +// +// Created by Jo Santamaria on 27/01/2021. +// Copyright © 2021 Flit Technologies Ltd. All rights reserved. +// + +import KarhooSDK +import KarhooUISDK + +final class KarhooConfig: KarhooUISDKConfiguration { + + static var auth: AuthenticationMethod = .karhooUser + + func environment() -> KarhooEnvironment { + return Keys.staging() + } + + func authenticationMethod() -> AuthenticationMethod { + return KarhooConfig.auth + } +} diff --git a/Client/ViewController.swift b/Client/ViewController.swift index ef9341c1a..9dc30cea7 100644 --- a/Client/ViewController.swift +++ b/Client/ViewController.swift @@ -68,6 +68,9 @@ class ViewController: UIViewController { } @objc func guestBookingTapped(sender: UIButton) { + let guestSettings = GuestSettings(identifier: Keys.braintreeGuestIdentifier, + referer: Keys.referer, + organisationId: Keys.braintreeGuestOrganisationId) KarhooConfig.auth = .guest(settings: guestSettings) showKarhoo() } @@ -78,15 +81,19 @@ class ViewController: UIViewController { } @objc func tokenExchangeBookingTapped(sender: UIButton) { + let tokenExchangeSettings = TokenExchangeSettings(clientId: Keys.braintreeTokenClientId, scope: Keys.braintreeTokenScope) KarhooConfig.auth = .tokenExchange(settings: tokenExchangeSettings) tokenLoginAndShowKarhoo() } private func usernamePasswordLoginAndShowKarhoo() { + KarhooConfig.auth = .karhooUser let userService = Karhoo.getUserService() userService.logout().execute(callback: { _ in}) - userService.login(userLogin: Keys.userLogin).execute(callback: { result in + let userLogin = UserLogin(username: Keys.userServiceEmailBraintree, + password: Keys.userServicePasswordBraintree) + userService.login(userLogin: userLogin).execute(callback: { result in print("login: \(result)") if result.isSuccess() { self.showKarhoo() @@ -97,7 +104,7 @@ class ViewController: UIViewController { private func tokenLoginAndShowKarhoo() { let authService = Karhoo.getAuthService() - authService.login(token: Keys.authToken).execute { result in + authService.login(token: Keys.braintreeAuthToken).execute { result in print("token login: \(result)") if result.isSuccess() { self.showKarhoo() @@ -109,7 +116,6 @@ class ViewController: UIViewController { booking = KarhooUI().screens().booking().buildBookingScreen(journeyInfo: nil, passengerDetails: nil, callback: { [weak self] result in - self?.logout() switch result { case .completed(let result): switch result { diff --git a/Gemfile.lock b/Gemfile.lock index f99cab68b..c8f15f780 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,8 +1,8 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.2) - activesupport (5.2.4.4) + CFPropertyList (3.0.3) + activesupport (5.2.5) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) @@ -12,22 +12,23 @@ GEM algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) + artifactory (3.0.15) atomos (0.1.3) - aws-eventstream (1.1.0) - aws-partitions (1.399.0) - aws-sdk-core (3.109.3) + aws-eventstream (1.1.1) + aws-partitions (1.445.0) + aws-sdk-core (3.114.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.39.0) - aws-sdk-core (~> 3, >= 3.109.0) + aws-sdk-kms (1.43.0) + aws-sdk-core (~> 3, >= 3.112.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.85.0) - aws-sdk-core (~> 3, >= 3.109.0) + aws-sdk-s3 (1.93.1) + aws-sdk-core (~> 3, >= 3.112.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) - aws-sigv4 (1.2.2) + aws-sigv4 (1.2.3) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) claide (1.0.3) @@ -36,10 +37,10 @@ GEM nap open4 (~> 1.3) clamp (1.3.2) - cocoapods (1.10.0) + cocoapods (1.10.1) addressable (~> 2.6) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.10.0) + cocoapods-core (= 1.10.1) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 1.4.0, < 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -54,7 +55,7 @@ GEM nap (~> 1.0) ruby-macho (~> 1.4) xcodeproj (>= 1.19.0, < 2.0) - cocoapods-core (1.10.0) + cocoapods-core (1.10.1) activesupport (> 5.0, < 6) addressable (~> 2.6) algoliasearch (~> 1.0) @@ -77,10 +78,10 @@ GEM colored2 (3.1.2) commander-fastlane (4.4.6) highline (~> 1.7.2) - concurrent-ruby (1.1.7) + concurrent-ruby (1.1.8) cork (0.3.0) colored2 (~> 3.1) - danger (8.2.1) + danger (8.2.3) claide (~> 1.0) claide-plugins (>= 0.9.2) colored2 (~> 3.1) @@ -92,13 +93,13 @@ GEM kramdown-parser-gfm (~> 1.0) no_proxy_fix octokit (~> 4.7) - terminal-table (~> 1) + terminal-table (>= 1, < 4) danger-junit (1.0.2) danger (> 2.0) ox (~> 2.0) danger-plugin-api (1.0.0) danger (> 2.0) - danger-swiftlint (0.24.5) + danger-swiftlint (0.26.0) danger rake (> 10) thor (~> 0.19) @@ -108,31 +109,37 @@ GEM danger (>= 2.1) xcov (>= 1.7.3) declarative (0.0.20) - declarative-option (0.1.0) - digest-crc (0.6.1) - rake (~> 13.0) + digest-crc (0.6.3) + rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) dotenv (2.7.6) - emoji_regex (3.2.1) + emoji_regex (3.2.2) escape (0.0.4) - ethon (0.12.0) - ffi (>= 1.3.0) - excon (0.78.0) - faraday (1.1.0) + ethon (0.13.0) + ffi (>= 1.15.0) + excon (0.80.1) + faraday (1.4.1) + faraday-excon (~> 1.1) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.1) multipart-post (>= 1.2, < 3) - ruby2_keywords + ruby2_keywords (>= 0.0.4) faraday-cookie_jar (0.0.7) faraday (>= 0.8.0) http-cookie (~> 1.0.0) + faraday-excon (1.1.0) faraday-http-cache (2.2.0) faraday (>= 0.8) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.1.0) faraday_middleware (1.0.0) faraday (~> 1.0) - fastimage (2.2.0) - fastlane (2.168.0) + fastimage (2.2.3) + fastlane (2.180.1) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.3, < 3.0.0) + artifactory (~> 3.0) aws-sdk-s3 (~> 1.0) babosa (>= 1.0.3, < 2.0.0) bundler (>= 1.12.0, < 3.0.0) @@ -153,6 +160,7 @@ GEM jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) multipart-post (~> 2.0.0) + naturally (~> 2.2) plist (>= 3.1.0, < 4.0.0) rubyzip (>= 2.0.0, < 3.0.0) security (= 0.1.3) @@ -166,11 +174,11 @@ GEM xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) - ffi (1.13.1) + ffi (1.15.0) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - git (1.7.0) + git (1.8.1) rchardet (~> 1.8) google-api-client (0.38.0) addressable (~> 2.5, >= 2.5.1) @@ -180,20 +188,35 @@ GEM representable (~> 3.0) retriable (>= 2.0, < 4.0) signet (~> 0.12) + google-apis-core (0.2.1) + addressable (~> 2.5, >= 2.5.1) + googleauth (~> 0.14) + httpclient (>= 2.8.1, < 3.0) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.0) + rexml + signet (~> 0.14) + webrick + google-apis-iamcredentials_v1 (0.1.0) + google-apis-core (~> 0.1) + google-apis-storage_v1 (0.2.0) + google-apis-core (~> 0.1) google-cloud-core (1.5.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) google-cloud-env (1.4.0) faraday (>= 0.17.3, < 2.0) google-cloud-errors (1.0.1) - google-cloud-storage (1.29.1) + google-cloud-storage (1.30.0) addressable (~> 2.5) digest-crc (~> 0.4) - google-api-client (~> 0.33) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.1) google-cloud-core (~> 1.2) googleauth (~> 0.9) mini_mime (~> 1.0) - googleauth (0.14.0) + googleauth (0.15.1) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) @@ -204,55 +227,57 @@ GEM http-cookie (1.0.3) domain_name (~> 0.5) httpclient (2.8.3) - i18n (1.8.5) + i18n (1.8.10) concurrent-ruby (~> 1.0) jmespath (1.4.0) - json (2.3.1) + json (2.5.1) jwt (2.2.2) - kramdown (2.3.0) + kramdown (2.3.1) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) memoist (0.16.2) mini_magick (4.11.0) - mini_mime (1.0.2) - mini_portile2 (2.4.0) - minitest (5.14.2) + mini_mime (1.1.0) + mini_portile2 (2.5.0) + minitest (5.14.4) molinillo (0.6.6) multi_json (1.15.0) multipart-post (2.0.0) nanaimo (0.3.0) nap (1.1.0) - naturally (2.2.0) + naturally (2.2.1) netrc (0.11.0) no_proxy_fix (0.1.2) - nokogiri (1.10.10) - mini_portile2 (~> 2.4.0) - octokit (4.19.0) + nokogiri (1.11.3) + mini_portile2 (~> 2.5.0) + racc (~> 1.4) + octokit (4.20.0) faraday (>= 0.9) sawyer (~> 0.8.0, >= 0.5.3) open4 (1.3.4) os (1.1.1) - ox (2.13.4) - plist (3.5.0) + ox (2.14.4) + plist (3.6.0) public_suffix (4.0.6) - rake (13.0.1) + racc (1.5.2) + rake (13.0.3) rchardet (1.8.0) - representable (3.0.4) + representable (3.1.1) declarative (< 0.1.0) - declarative-option (< 0.2.0) + trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.4) + rexml (3.2.5) rouge (2.0.7) ruby-macho (1.4.0) - ruby2_keywords (0.0.2) + ruby2_keywords (0.0.4) rubyzip (2.3.0) sawyer (0.8.2) addressable (>= 2.3.5) faraday (> 0.8, < 2.0) security (0.1.3) - signet (0.14.0) + signet (0.14.1) addressable (~> 2.3) faraday (>= 0.17.3, < 2.0) jwt (>= 1.5, < 3.0) @@ -261,7 +286,7 @@ GEM CFPropertyList naturally slack-notifier (2.3.2) - slather (2.5.0) + slather (2.6.0) CFPropertyList (>= 2.2, < 4) activesupport clamp (~> 1.3) @@ -272,19 +297,21 @@ GEM unicode-display_width (~> 1.1, >= 1.1.1) thor (0.20.3) thread_safe (0.3.6) + trailblazer-option (0.1.1) tty-cursor (0.7.1) tty-screen (0.8.1) tty-spinner (0.9.3) tty-cursor (~> 0.7) typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (1.2.8) + tzinfo (1.2.9) thread_safe (~> 0.1) uber (0.1.0) unf (0.1.4) unf_ext unf_ext (0.0.7.7) unicode-display_width (1.7.0) + webrick (1.7.0) word_wrap (1.0.0) xcodeproj (1.19.0) CFPropertyList (>= 2.3.3, < 4.0) @@ -301,7 +328,7 @@ GEM xcresult (~> 0.2.0) xcpretty (0.3.0) rouge (~> 2.0.7) - xcpretty-travis-formatter (1.0.0) + xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) xcresult (0.2.1) @@ -320,4 +347,4 @@ DEPENDENCIES xcov BUNDLED WITH - 2.1.4 + 2.2.7 diff --git a/KarhooUISDK.podspec b/KarhooUISDK.podspec index b6f5a5343..67c37e9fd 100644 --- a/KarhooUISDK.podspec +++ b/KarhooUISDK.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "KarhooUISDK" - s.version = "1.4.0" + s.version = "1.5.0" s.summary = "UI SDK for the Karhoo platform" s.homepage = "https://github.com/karhoo/Karhoo-iOS-UI-SDK.git" @@ -13,7 +13,7 @@ Pod::Spec.new do |s| s.resource_bundles = { 'KarhooUISDK' => [ - 'KarhooUISDK/**/*{xib,storyboard,xcassets,strings,bundle,lproj}' + 'KarhooUISDK/**/*{xib,storyboard,xcassets,strings,stringsdict,bundle,lproj}' ] } @@ -24,8 +24,8 @@ Pod::Spec.new do |s| s.dependency 'KarhooSDK' s.dependency 'FloatingPanel', '2.0.1' - s.dependency 'BraintreeDropIn' - s.dependency 'Braintree/PaymentFlow' + s.dependency 'BraintreeDropIn', '~> 8.1' + s.dependency 'Braintree/PaymentFlow', '~> 4.37' s.dependency 'PhoneNumberKit', '3.3.1' s.dependency 'Adyen', '3.6.0' diff --git a/KarhooUISDK.xcodeproj/project.pbxproj b/KarhooUISDK.xcodeproj/project.pbxproj index fca819dc4..1463d2af0 100644 --- a/KarhooUISDK.xcodeproj/project.pbxproj +++ b/KarhooUISDK.xcodeproj/project.pbxproj @@ -7,10 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 09022B242239133700C4A7EE /* MockViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09022B232239133700C4A7EE /* MockViewController.swift */; }; - 090F08E021C934EB000C7E50 /* MockDatePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090F08DD21C934EB000C7E50 /* MockDatePickerView.swift */; }; - 090F08E121C934EB000C7E50 /* MockTimeSinceNowProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090F08DF21C934EB000C7E50 /* MockTimeSinceNowProvider.swift */; }; - 090F08E421C93591000C7E50 /* DatePickerPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090F08E321C93591000C7E50 /* DatePickerPresenterSpec.swift */; }; 0916BB6A235F01170064A5D6 /* KarhooUISDKConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0916BB69235F01170064A5D6 /* KarhooUISDKConfiguration.swift */; }; 0916BB72236CA2300064A5D6 /* KarhooAddressMapMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0916BB71236CA2300064A5D6 /* KarhooAddressMapMVP.swift */; }; 091EA9D421AC4AA700849112 /* AccessibilityIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091EA9D321AC4AA700849112 /* AccessibilityIdentifier.swift */; }; @@ -28,60 +24,23 @@ 092F281C22B25B0700AF8E0E /* ThreeDSecureProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 092F281722B25B0700AF8E0E /* ThreeDSecureProvider.swift */; }; 092F281D22B25B0700AF8E0E /* BraintreeThreeDSecureProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 092F281822B25B0700AF8E0E /* BraintreeThreeDSecureProvider.swift */; }; 092F281F22B25B3700AF8E0E /* OperationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 092F281E22B25B3700AF8E0E /* OperationResult.swift */; }; - 092F282122B25C7800AF8E0E /* MockPaymentNonceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 092F282022B25C7800AF8E0E /* MockPaymentNonceProvider.swift */; }; - 092F282322B2607D00AF8E0E /* PrimitiveUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 092F282222B2607D00AF8E0E /* PrimitiveUtil.swift */; }; - 093D2E6E2224346C00D5F031 /* PopupDialogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 093D2E6D2224346C00D5F031 /* PopupDialogView.swift */; }; 094551A321B9818200F029D1 /* AddressViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0991067221B8291900BD7E6F /* AddressViewController.swift */; }; 0946CB5D21CBDF0400DBDD42 /* BookingRequestScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0946CB5C21CBDF0400DBDD42 /* BookingRequestScreenBuilder.swift */; }; - 0949543F21FF5A8800D930C0 /* MockBookingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0949543E21FF5A8800D930C0 /* MockBookingView.swift */; }; - 0949544B21FF5F0900D930C0 /* MockQuoteService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0949544221FF5F0800D930C0 /* MockQuoteService.swift */; }; - 0949545321FF6FC800D930C0 /* MockAddressBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0949545221FF6FC800D930C0 /* MockAddressBarView.swift */; }; - 0949545521FF7CDB00D930C0 /* MockKarhooMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0949545421FF7CDB00D930C0 /* MockKarhooMapView.swift */; }; - 094954572201C13E00D930C0 /* MockPhoneNumberCaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094954562201C13E00D930C0 /* MockPhoneNumberCaller.swift */; }; - 0949545A2201C1ED00D930C0 /* CLLocationCoordinate2D+Equatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094954592201C1ED00D930C0 /* CLLocationCoordinate2D+Equatable.swift */; }; - 0949545C2201C2BA00D930C0 /* MockDataFormatterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0949545B2201C2BA00D930C0 /* MockDataFormatterType.swift */; }; - 0949545E2201C3E900D930C0 /* MockUserLocationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0949545D2201C3E900D930C0 /* MockUserLocationProvider.swift */; }; 094AE85421C913020046EC3C /* DatePickerScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094AE85321C913020046EC3C /* DatePickerScreenBuilder.swift */; }; 094AE85D21C9145D0046EC3C /* DatePickerMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094AE85621C9145D0046EC3C /* DatePickerMVP.swift */; }; 094AE85E21C9145D0046EC3C /* DatePickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094AE85821C9145D0046EC3C /* DatePickerViewController.swift */; }; 094AE85F21C9145D0046EC3C /* DatePickerViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 094AE85921C9145D0046EC3C /* DatePickerViewController.xib */; }; 094AE86021C9145D0046EC3C /* TimeSinceNowProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094AE85B21C9145D0046EC3C /* TimeSinceNowProvider.swift */; }; 094AE86121C9145D0046EC3C /* KarhooDatePickerPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094AE85C21C9145D0046EC3C /* KarhooDatePickerPresenter.swift */; }; - 094B764022CE729400326CE1 /* BraintreePaymentNonceProviderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094B763D22CE729300326CE1 /* BraintreePaymentNonceProviderSpec.swift */; }; - 094B764222CE729400326CE1 /* BraintreeThreeDSecureProviderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094B763F22CE729400326CE1 /* BraintreeThreeDSecureProviderSpec.swift */; }; - 094B764422CE731200326CE1 /* TripStatesGetterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094B764322CE731200326CE1 /* TripStatesGetterSpec.swift */; }; - 094B764622CE734D00326CE1 /* MockThreeDSecureProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094B764522CE734D00326CE1 /* MockThreeDSecureProvider.swift */; }; 095A03D92333D17E007D805E /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 095A03D82333D17E007D805E /* BaseViewController.swift */; }; 095B20D622649CEC00119D11 /* ScreenResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 095B20D522649CEC00119D11 /* ScreenResult.swift */; }; 095D7451231822C5002253C0 /* KarhooTripRatingCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 095D7450231822C5002253C0 /* KarhooTripRatingCache.swift */; }; 095D745323182313002253C0 /* TripRatingCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 095D745223182313002253C0 /* TripRatingCache.swift */; }; - 095D7456231825C7002253C0 /* MockTripRatingCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 095D7455231825C7002253C0 /* MockTripRatingCache.swift */; }; - 095D7458231827B4002253C0 /* KarhooTripRatingCacheSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 095D7457231827B4002253C0 /* KarhooTripRatingCacheSpec.swift */; }; - 096192F621BEAB9C0052B71C /* UnitTestSetup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 096192F521BEAB9C0052B71C /* UnitTestSetup.swift */; }; - 0966BDBA225CF8A90032C76C /* KarhooBookingViewController+BuilderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0966BDB9225CF8A90032C76C /* KarhooBookingViewController+BuilderSpec.swift */; }; - 0966BDBC225DFFE60032C76C /* TripExtSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0966BDBB225DFFE60032C76C /* TripExtSpec.swift */; }; 0968D82122F82B8300047FCF /* TripFeedbackMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968D82022F82B8300047FCF /* TripFeedbackMVP.swift */; }; - 0968D82522F82F8C00047FCF /* TripFeedbackPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968D82422F82F8C00047FCF /* TripFeedbackPresenterSpec.swift */; }; - 0968D82822F8649900047FCF /* MockTripFeedbackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968D82722F8649900047FCF /* MockTripFeedbackView.swift */; }; - 0968F0EA21BE7FF100745370 /* MockAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0E521BE7FF100745370 /* MockAddressView.swift */; }; - 0968F0EB21BE7FF100745370 /* MockAddressSearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0E621BE7FF100745370 /* MockAddressSearchBar.swift */; }; - 0968F0EC21BE7FF100745370 /* MockAddressSearchProviderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0E821BE7FF100745370 /* MockAddressSearchProviderDelegate.swift */; }; - 0968F0ED21BE7FF100745370 /* MockAddressSearchProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0E921BE7FF100745370 /* MockAddressSearchProvider.swift */; }; - 0968F0EF21BE816F00745370 /* TestUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0EE21BE816F00745370 /* TestUtil.swift */; }; - 0968F0FD21BE850F00745370 /* MockCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0F621BE850F00745370 /* MockCall.swift */; }; - 0968F0FE21BE850F00745370 /* MockKarhooPollExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0F721BE850F00745370 /* MockKarhooPollExecutor.swift */; }; - 0968F0FF21BE850F00745370 /* MockKarhooExecutable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0F821BE850F00745370 /* MockKarhooExecutable.swift */; }; - 0968F10021BE850F00745370 /* MockPollCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0F921BE850F00745370 /* MockPollCall.swift */; }; - 0968F10221BE850F00745370 /* MockObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0FC21BE850F00745370 /* MockObservable.swift */; }; - 0968F10521BE859400745370 /* MockAlertHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F10421BE859400745370 /* MockAlertHandler.swift */; }; - 0968F10721BE885100745370 /* MockError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F10621BE885100745370 /* MockError.swift */; }; - 097050A521FF0AF300E53AD2 /* MockBookingStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097050A421FF0AF300E53AD2 /* MockBookingStatus.swift */; }; 097050CF21FF27FF00E53AD2 /* KarhooUISDKConfigurationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097050CE21FF27FF00E53AD2 /* KarhooUISDKConfigurationProvider.swift */; }; 0973872221DE77B3004BD5F9 /* NSAttributedString+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0973872121DE77B3004BD5F9 /* NSAttributedString+Utils.swift */; }; - 097800A4226F1FE6008772E4 /* MockSideMenuHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097800A3226F1FE5008772E4 /* MockSideMenuHandler.swift */; }; 097800A6226F427D008772E4 /* LocationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097800A5226F427D008772E4 /* LocationService.swift */; }; 097800A8226F4434008772E4 /* KarhooLocationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097800A7226F4434008772E4 /* KarhooLocationService.swift */; }; - 097800AA226F4886008772E4 /* MockLocationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097800A9226F4886008772E4 /* MockLocationService.swift */; }; 097BF283234F2A3E00BBE418 /* VehicleCapacityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097BF282234F2A3E00BBE418 /* VehicleCapacityView.swift */; }; 0989E631220313740062474A /* BookingStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0989E630220313740062474A /* BookingStatus.swift */; }; 0991067621B8291A00BD7E6F /* KarhooAddressSearchBarPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0991066321B8291900BD7E6F /* KarhooAddressSearchBarPresenter.swift */; }; @@ -108,21 +67,12 @@ 0991530221BFDC3000B46D9F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0991530021BFDB6400B46D9F /* Assets.xcassets */; }; 0999CBB0220DDA0300A93AF9 /* KarhooUIScreenRouting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0999CBAF220DDA0300A93AF9 /* KarhooUIScreenRouting.swift */; }; 09A1F88F225CBCFF00B3DBE2 /* MenuContentMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09A1F88E225CBCFF00B3DBE2 /* MenuContentMVP.swift */; }; - 09AAEF9621C4270900A04EEC /* FlightNumberValidatorSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09AAEF9521C4270800A04EEC /* FlightNumberValidatorSpec.swift */; }; - 09AAEF9821C4283200A04EEC /* MockValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09AAEF9721C4283200A04EEC /* MockValidator.swift */; }; - 09B30F5C224CE8BF007768CF /* CancelRideBehaviourSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B30F5A224CE8BF007768CF /* CancelRideBehaviourSpec.swift */; }; - 09B30F5D224CE8BF007768CF /* TripsListSorterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B30F5B224CE8BF007768CF /* TripsListSorterSpec.swift */; }; 09B30F692253986B007768CF /* mockImage.png in Resources */ = {isa = PBXBuildFile; fileRef = 09B30F682253986B007768CF /* mockImage.png */; }; - 09BDD18821C2C20A0074421C /* MockUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BDD18721C2C20A0074421C /* MockUserDefaults.swift */; }; 09BDD19121C2CAD00074421C /* FlightDetailsMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BDD18A21C2CAD00074421C /* FlightDetailsMVP.swift */; }; 09BDD19221C2CAD00074421C /* KarhooFlightDetailsPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BDD18C21C2CAD00074421C /* KarhooFlightDetailsPresenter.swift */; }; 09BDD19421C2CAD00074421C /* FlightDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BDD18F21C2CAD00074421C /* FlightDetailsViewController.swift */; }; 09BDD19521C2CAD00074421C /* FlightDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BDD19021C2CAD00074421C /* FlightDetails.swift */; }; - 09BDD19821C2CBD00074421C /* FlightDetailsPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BDD19721C2CBCF0074421C /* FlightDetailsPresenterSpec.swift */; }; 09C169B8227C8EFF00CF7E66 /* AddressType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C169B7227C8EFF00CF7E66 /* AddressType.swift */; }; - 09C169BA22819BBF00CF7E66 /* MockBookingMapStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C169B922819BBF00CF7E66 /* MockBookingMapStrategy.swift */; }; - 09C169BC22819C1A00CF7E66 /* MockPickupOnlyStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C169BB22819C1A00CF7E66 /* MockPickupOnlyStrategy.swift */; }; - 09C169C02281B7C700CF7E66 /* BaseViewControllerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C169BF2281B7C700CF7E66 /* BaseViewControllerSpec.swift */; }; 09C7649321DE665000CD81AB /* BookingScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C7649221DE665000CD81AB /* BookingScreenBuilder.swift */; }; 09C7659B21DE688100CD81AB /* QuoteListPanelLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C7656121DE688000CD81AB /* QuoteListPanelLayout.swift */; }; 09C7659C21DE688100CD81AB /* KarhooQuoteSortView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C7656321DE688000CD81AB /* KarhooQuoteSortView.swift */; }; @@ -155,51 +105,184 @@ 09C765C321DE688100CD81AB /* TripAllocationMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C7659721DE688000CD81AB /* TripAllocationMVP.swift */; }; 09C765C421DE688100CD81AB /* KarhooQuoteSorter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C7659921DE688000CD81AB /* KarhooQuoteSorter.swift */; }; 09C765C521DE688100CD81AB /* BookingMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C7659A21DE688000CD81AB /* BookingMVP.swift */; }; - 09D293C622C651C20051C455 /* QtaStringFormatterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D293C322C651C10051C455 /* QtaStringFormatterSpec.swift */; }; - 09D293C722C651C20051C455 /* KarhooDateFormatterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D293C422C651C10051C455 /* KarhooDateFormatterSpec.swift */; }; - 09D293C822C651C20051C455 /* CurrencyCodeConverterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D293C522C651C10051C455 /* CurrencyCodeConverterSpec.swift */; }; 09D8B29422F3491F00569C55 /* TripFeedbackScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D8B29322F3491F00569C55 /* TripFeedbackScreenBuilder.swift */; }; - 09D8B29622F444AA00569C55 /* MockFeedbackScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D8B29522F444AA00569C55 /* MockFeedbackScreenBuilder.swift */; }; 09DA1A3122F1A866004C6B20 /* FeedbackButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DA1A3022F1A866004C6B20 /* FeedbackButtonView.swift */; }; 09DA1A3322F1A8F4004C6B20 /* FeedbackButtonMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DA1A3222F1A8F4004C6B20 /* FeedbackButtonMVP.swift */; }; - 09DCC7F421BE7CE000DF02B9 /* KarhooAddressSearchBarPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DCC7F021BE7CE000DF02B9 /* KarhooAddressSearchBarPresenterSpec.swift */; }; - 09DCC7F521BE7CE000DF02B9 /* KarhooAddressPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DCC7F121BE7CE000DF02B9 /* KarhooAddressPresenterSpec.swift */; }; - 09DCC7F621BE7CE000DF02B9 /* KarhooAddressSearchProviderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DCC7F321BE7CE000DF02B9 /* KarhooAddressSearchProviderSpec.swift */; }; 09DE8D46221C658B00451B3C /* BraintreePaymentScreensBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DE8D45221C658B00451B3C /* BraintreePaymentScreensBuilder.swift */; }; 09E0249B21C2D7D40071E367 /* FlightDetailsScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E0249A21C2D7D40071E367 /* FlightDetailsScreenBuilder.swift */; }; 09E024A021C2D9FD0071E367 /* FlightNumberValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E0249F21C2D9FD0071E367 /* FlightNumberValidator.swift */; }; - 09E1475521C7ED06003BB30B /* MockFlightDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E1475421C7ED06003BB30B /* MockFlightDetailsView.swift */; }; - 09E35D5721E5117C003E840C /* MockBookingAllocationSpinnerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D4921E5117C003E840C /* MockBookingAllocationSpinnerView.swift */; }; - 09E35D5821E5117C003E840C /* MockTripAllocationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D4A21E5117C003E840C /* MockTripAllocationView.swift */; }; - 09E35D5921E5117C003E840C /* MockQuoteListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D4C21E5117C003E840C /* MockQuoteListView.swift */; }; - 09E35D5A21E5117C003E840C /* MockQuoteCategoryBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D4E21E5117C003E840C /* MockQuoteCategoryBarView.swift */; }; - 09E35D5C21E5117C003E840C /* MockPickupOnlyStrategyDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D5221E5117C003E840C /* MockPickupOnlyStrategyDelegate.swift */; }; - 09E35D5D21E5117C003E840C /* MockQuoteSorter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D5421E5117C003E840C /* MockQuoteSorter.swift */; }; - 09E35D5E21E5117C003E840C /* MockQuoteSortView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D5621E5117C003E840C /* MockQuoteSortView.swift */; }; - 09E35D7021E5118A003E840C /* KarhooBookingPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6021E5118A003E840C /* KarhooBookingPresenterSpec.swift */; }; - 09E35D7121E5118A003E840C /* BookingAllocationSpinnerPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6221E5118A003E840C /* BookingAllocationSpinnerPresenterSpec.swift */; }; - 09E35D7221E5118A003E840C /* KarhooTripAllocationPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6321E5118A003E840C /* KarhooTripAllocationPresenterSpec.swift */; }; - 09E35D7321E5118A003E840C /* KarhooQuoteListPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6521E5118A003E840C /* KarhooQuoteListPresenterSpec.swift */; }; - 09E35D7421E5118A003E840C /* KarhooQuoteCategoryBarPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6721E5118A003E840C /* KarhooQuoteCategoryBarPresenterSpec.swift */; }; - 09E35D7521E5118A003E840C /* BookingMapPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6921E5118A003E840C /* BookingMapPresenterSpec.swift */; }; - 09E35D7621E5118A003E840C /* DestinationSetStrategySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6A21E5118A003E840C /* DestinationSetStrategySpec.swift */; }; - 09E35D7721E5118A003E840C /* PickupOnlyStrategySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6B21E5118A003E840C /* PickupOnlyStrategySpec.swift */; }; - 09E35D7821E5118A003E840C /* BookingAddressBarPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6D21E5118A003E840C /* BookingAddressBarPresenterSpec.swift */; }; - 09E35D7921E5118A003E840C /* KarhooQuoteSorterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6F21E5118A003E840C /* KarhooQuoteSorterSpec.swift */; }; 09E683212374236100BFF5B9 /* KarhooAddressMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E683202374236100BFF5B9 /* KarhooAddressMapView.swift */; }; 09E683232374522900BFF5B9 /* KarhooAddressMapPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E683222374522900BFF5B9 /* KarhooAddressMapPresenter.swift */; }; - 09E68326237972C000BFF5B9 /* KarhooAddressMapPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E68325237972C000BFF5B9 /* KarhooAddressMapPresenterSpec.swift */; }; - 09E683292379735B00BFF5B9 /* MockAddressMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E683282379735B00BFF5B9 /* MockAddressMapView.swift */; }; - 09ED7B1C21C2A7E000CF6D73 /* KarhooRecentAddressProviderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09ED7B1B21C2A7E000CF6D73 /* KarhooRecentAddressProviderSpec.swift */; }; - 09ED7B1E21C2A81200CF6D73 /* MockRecentAddressProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09ED7B1D21C2A81200CF6D73 /* MockRecentAddressProvider.swift */; }; - 09F12DC722313E300024D6E9 /* MockBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F12DC622313E300024D6E9 /* MockBaseViewController.swift */; }; - 09F12DC92232ABD30024D6E9 /* MockPopupDialogScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F12DC82232ABD30024D6E9 /* MockPopupDialogScreenBuilder.swift */; }; 09F60CDF226623A200023C74 /* SideMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F60CDE226623A200023C74 /* SideMenu.swift */; }; 09F60CE9226756AF00023C74 /* SideMenuHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F60CE8226756AF00023C74 /* SideMenuHandler.swift */; }; - 09F86F81222D60AC008C86DE /* TestBroadcaster.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F86F7F222D60AB008C86DE /* TestBroadcaster.swift */; }; - 09F86F84222D84A8008C86DE /* MockAppStateNotifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F86F83222D84A8008C86DE /* MockAppStateNotifier.swift */; }; - 09F86F86222D8553008C86DE /* MockBookingDetailsObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F86F85222D8553008C86DE /* MockBookingDetailsObserver.swift */; }; 11835BEF4BCC4A95D6F37450 /* Pods_KarhooUISDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F928AAF8C70E5FFDE416BC /* Pods_KarhooUISDK.framework */; }; + 1413303225DBDC3100EDAD3B /* Keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1413303125DBDC3100EDAD3B /* Keys.swift */; }; + 14707C3925D54C2100CAD083 /* MockRidesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F542211D38E00FB6BB5 /* MockRidesView.swift */; }; + 14707C3A25D54C2100CAD083 /* DestinationSetStrategySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6A21E5118A003E840C /* DestinationSetStrategySpec.swift */; }; + 14707C3B25D54C2100CAD083 /* UINavigationSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F7F221726C8006C48F2 /* UINavigationSpec.swift */; }; + 14707C3C25D54C2100CAD083 /* BookingAllocationSpinnerPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6221E5118A003E840C /* BookingAllocationSpinnerPresenterSpec.swift */; }; + 14707C3D25D54C2100CAD083 /* MockAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9D9917242CEBC3004F1DBD /* MockAnalytics.swift */; }; + 14707C3E25D54C2100CAD083 /* MockNavigationItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F562216D4FC006C48F2 /* MockNavigationItem.swift */; }; + 14707C3F25D54C2100CAD083 /* MockAddressSearchProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0E921BE7FF100745370 /* MockAddressSearchProvider.swift */; }; + 14707C4025D54C2100CAD083 /* TripExtSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0966BDBB225DFFE60032C76C /* TripExtSpec.swift */; }; + 14707C4125D54C2100CAD083 /* KarhooRecentAddressProviderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09ED7B1B21C2A7E000CF6D73 /* KarhooRecentAddressProviderSpec.swift */; }; + 14707C4225D54C2100CAD083 /* MockCardRegistrationFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F5C2216D5AE006C48F2 /* MockCardRegistrationFlow.swift */; }; + 14707C4325D54C2100CAD083 /* MockStackButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F6F2211D7AF00FB6BB5 /* MockStackButtonView.swift */; }; + 14707C4425D54C2100CAD083 /* MockUserService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A5B97A25C1AD4600986616 /* MockUserService.swift */; }; + 14707C4525D54C2100CAD083 /* MockLocationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097800A9226F4886008772E4 /* MockLocationService.swift */; }; + 14707C4625D54C2100CAD083 /* MockValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09AAEF9721C4283200A04EEC /* MockValidator.swift */; }; + 14707C4725D54C2100CAD083 /* KarhooRidesPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F462211D34000FB6BB5 /* KarhooRidesPresenterSpec.swift */; }; + 14707C4825D54C2100CAD083 /* KarhooTripDetailsPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2D5221EEC9E008FE26D /* KarhooTripDetailsPresenterSpec.swift */; }; + 14707C4925D54C2100CAD083 /* MockTripScreenDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2FC221EEE8A008FE26D /* MockTripScreenDetailsView.swift */; }; + 14707C4A25D54C2100CAD083 /* MockTripSummaryInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2ED221EEDDE008FE26D /* MockTripSummaryInfoView.swift */; }; + 14707C4B25D54C2100CAD083 /* PopupDialogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 093D2E6D2224346C00D5F031 /* PopupDialogView.swift */; }; + 14707C4C25D54C2100CAD083 /* MockPollCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0F921BE850F00745370 /* MockPollCall.swift */; }; + 14707C4D25D54C2100CAD083 /* MockBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F12DC622313E300024D6E9 /* MockBaseViewController.swift */; }; + 14707C4E25D54C2100CAD083 /* MockAddressBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A5B99B25C1BB3500986616 /* MockAddressBarView.swift */; }; + 14707C4F25D54C2100CAD083 /* MockPrebookConfirmationScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F452216D0BB006C48F2 /* MockPrebookConfirmationScreenBuilder.swift */; }; + 14707C5025D54C2100CAD083 /* DefaultConstraintSwitcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13584221D64E8C005054AE /* DefaultConstraintSwitcherTests.swift */; }; + 14707C5125D54C2100CAD083 /* KarhooTripPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2D6221EEC9E008FE26D /* KarhooTripPresenterSpec.swift */; }; + 14707C5225D54C2100CAD083 /* TripScreenDetailsViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2D4221EEC9E008FE26D /* TripScreenDetailsViewModelSpec.swift */; }; + 14707C5325D54C2100CAD083 /* MockPickupOnlyStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C169BB22819C1A00CF7E66 /* MockPickupOnlyStrategy.swift */; }; + 14707C5425D54C2100CAD083 /* MockKarhooExecutable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0F821BE850F00745370 /* MockKarhooExecutable.swift */; }; + 14707C5525D54C2100CAD083 /* KarhooOriginEtaPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2DA221EECA8008FE26D /* KarhooOriginEtaPresenterSpec.swift */; }; + 14707C5625D54C2100CAD083 /* MockTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F8D2211E3FA00FB6BB5 /* MockTimeScheduler.swift */; }; + 14707C5725D54C2100CAD083 /* MockDatePickerScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F422216D0BB006C48F2 /* MockDatePickerScreenBuilder.swift */; }; + 14707C5825D54C2100CAD083 /* MockBookingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0949543E21FF5A8800D930C0 /* MockBookingView.swift */; }; + 14707C5925D54C2100CAD083 /* QuoteCellViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40A2852022B253870020D78F /* QuoteCellViewModelSpec.swift */; }; + 14707C5A25D54C2100CAD083 /* TripStatesGetterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094B764322CE731200326CE1 /* TripStatesGetterSpec.swift */; }; + 14707C5B25D54C2100CAD083 /* BookingStatusViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F872211E2C100FB6BB5 /* BookingStatusViewModelSpec.swift */; }; + 14707C5C25D54C2100CAD083 /* KarhooAddressSearchProviderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DCC7F321BE7CE000DF02B9 /* KarhooAddressSearchProviderSpec.swift */; }; + 14707C5D25D54C2100CAD083 /* DatePickerPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090F08E321C93591000C7E50 /* DatePickerPresenterSpec.swift */; }; + 14707C5E25D54C2100CAD083 /* MockUserLocationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0949545D2201C3E900D930C0 /* MockUserLocationProvider.swift */; }; + 14707C5F25D54C2100CAD083 /* KarhooTripsProviderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F852211E26400FB6BB5 /* KarhooTripsProviderSpec.swift */; }; + 14707C6025D54C2100CAD083 /* BookingAddressBarPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6D21E5118A003E840C /* BookingAddressBarPresenterSpec.swift */; }; + 14707C6125D54C2100CAD083 /* MockAddressMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A5B9AE25C1C61000986616 /* MockAddressMapView.swift */; }; + 14707C6225D54C2100CAD083 /* KarhooPrebookConfirmationPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1BFF22087CA600C3AD1D /* KarhooPrebookConfirmationPresenterSpec.swift */; }; + 14707C6325D54C2100CAD083 /* MockBookingRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13584A21D6752F005054AE /* MockBookingRequestView.swift */; }; + 14707C6425D54C2100CAD083 /* MockTripScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E30A221F1839008FE26D /* MockTripScreenBuilder.swift */; }; + 14707C6525D54C2100CAD083 /* MockFareService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 408AB682234F418B00B351B2 /* MockFareService.swift */; }; + 14707C6625D54C2100CAD083 /* MockAddressService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9D9919242CED15004F1DBD /* MockAddressService.swift */; }; + 14707C6725D54C2100CAD083 /* MockPaymentService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F612216D9C1006C48F2 /* MockPaymentService.swift */; }; + 14707C6825D54C2100CAD083 /* MockCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0F621BE850F00745370 /* MockCall.swift */; }; + 14707C6925D54C2100CAD083 /* ResizingSwitcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13584121D64E8C005054AE /* ResizingSwitcherTests.swift */; }; + 14707C6A25D54C2100CAD083 /* MockBookingRequestScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F462216D0BB006C48F2 /* MockBookingRequestScreenBuilder.swift */; }; + 14707C6B25D54C2100CAD083 /* MockTripService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13585121D67971005054AE /* MockTripService.swift */; }; + 14707C6C25D54C2100CAD083 /* KarhooAddressPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DCC7F121BE7CE000DF02B9 /* KarhooAddressPresenterSpec.swift */; }; + 14707C6D25D54C2100CAD083 /* TripMapPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2DD221EECB0008FE26D /* TripMapPresenterSpec.swift */; }; + 14707C6E25D54C2100CAD083 /* MockAddressSearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0E621BE7FF100745370 /* MockAddressSearchBar.swift */; }; + 14707C6F25D54C2100CAD083 /* TripDetailsViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F892211E30400FB6BB5 /* TripDetailsViewModelSpec.swift */; }; + 14707C7025D54C2100CAD083 /* MockRidesListActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F662211D3DD00FB6BB5 /* MockRidesListActions.swift */; }; + 14707C7125D54C2100CAD083 /* MockDataFormatterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0949545B2201C2BA00D930C0 /* MockDataFormatterType.swift */; }; + 14707C7225D54C2100CAD083 /* MockTripRatingCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 095D7455231825C7002253C0 /* MockTripRatingCache.swift */; }; + 14707C7325D54C2100CAD083 /* MockFlightDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E1475421C7ED06003BB30B /* MockFlightDetailsView.swift */; }; + 14707C7425D54C2100CAD083 /* MockBookingMapStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C169B922819BBF00CF7E66 /* MockBookingMapStrategy.swift */; }; + 14707C7525D54C2100CAD083 /* KarhooTripSummaryPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2EA221EED94008FE26D /* KarhooTripSummaryPresenterSpec.swift */; }; + 14707C7625D54C2100CAD083 /* MockUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BDD18721C2C20A0074421C /* MockUserDefaults.swift */; }; + 14707C7725D54C2100CAD083 /* BookingDetailsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13583E21D64E18005054AE /* BookingDetailsSpec.swift */; }; + 14707C7825D54C2100CAD083 /* MockAlertHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A5B97225C1AC7C00986616 /* MockAlertHandler.swift */; }; + 14707C7925D54C2100CAD083 /* MockTripsSorter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F6B2211D76100FB6BB5 /* MockTripsSorter.swift */; }; + 14707C7A25D54C2100CAD083 /* MockAddressScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F472216D0BB006C48F2 /* MockAddressScreenBuilder.swift */; }; + 14707C7B25D54C2100CAD083 /* MockPaymentNonceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 092F282022B25C7800AF8E0E /* MockPaymentNonceProvider.swift */; }; + 14707C7C25D54C2100CAD083 /* KarhooBookingRequestPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13584621D64F66005054AE /* KarhooBookingRequestPresenterSpec.swift */; }; + 14707C7D25D54C2100CAD083 /* MockQuoteSortView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D5621E5117C003E840C /* MockQuoteSortView.swift */; }; + 14707C7E25D54C2100CAD083 /* KarhooDateFormatterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D293C422C651C10051C455 /* KarhooDateFormatterSpec.swift */; }; + 14707C7F25D54C2100CAD083 /* BookingMapPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6921E5118A003E840C /* BookingMapPresenterSpec.swift */; }; + 14707C8025D54C2100CAD083 /* KarhooQuoteSorterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6F21E5118A003E840C /* KarhooQuoteSorterSpec.swift */; }; + 14707C8125D54C2100CAD083 /* KarhooBookingStatusSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCF7E68E2226A76B00EEBF98 /* KarhooBookingStatusSpec.swift */; }; + 14707C8225D54C2100CAD083 /* MockViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09022B232239133700C4A7EE /* MockViewController.swift */; }; + 14707C8325D54C2200CAD083 /* MockCancelRideBehaviour.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F692211D67200FB6BB5 /* MockCancelRideBehaviour.swift */; }; + 14707C8425D54C2200CAD083 /* MockDatePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090F08DD21C934EB000C7E50 /* MockDatePickerView.swift */; }; + 14707C8525D54C2200CAD083 /* KarhooRideDetailsPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A5B9C625C1CFCB00986616 /* KarhooRideDetailsPresenterSpec.swift */; }; + 14707C8625D54C2200CAD083 /* MockPaymentScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F702216F8B7006C48F2 /* MockPaymentScreenBuilder.swift */; }; + 14707C8725D54C2200CAD083 /* MockObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0FC21BE850F00745370 /* MockObservable.swift */; }; + 14707C8825D54C2200CAD083 /* MockDriverTrackingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E300221EF042008FE26D /* MockDriverTrackingService.swift */; }; + 14707C8925D54C2200CAD083 /* MockDestinationEtaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2FA221EEE82008FE26D /* MockDestinationEtaView.swift */; }; + 14707C8A25D54C2200CAD083 /* MockKarhooMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0949545421FF7CDB00D930C0 /* MockKarhooMapView.swift */; }; + 14707C8B25D54C2200CAD083 /* MockRideCellStackButtonActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F5E2211D3D700FB6BB5 /* MockRideCellStackButtonActions.swift */; }; + 14707C8C25D54C2200CAD083 /* KarhooQuoteCategoryBarPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6721E5118A003E840C /* KarhooQuoteCategoryBarPresenterSpec.swift */; }; + 14707C8D25D54C2200CAD083 /* MockOriginEtaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2FE221EEE94008FE26D /* MockOriginEtaView.swift */; }; + 14707C8E25D54C2200CAD083 /* BaseViewControllerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C169BF2281B7C700CF7E66 /* BaseViewControllerSpec.swift */; }; + 14707C8F25D54C2200CAD083 /* RideDetailsStackButtonPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F4B2211D34100FB6BB5 /* RideDetailsStackButtonPresenterSpec.swift */; }; + 14707C9025D54C2200CAD083 /* KarhooBookingViewController+BuilderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0966BDB9225CF8A90032C76C /* KarhooBookingViewController+BuilderSpec.swift */; }; + 14707C9125D54C2200CAD083 /* PrimitiveUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 092F282222B2607D00AF8E0E /* PrimitiveUtil.swift */; }; + 14707C9225D54C2200CAD083 /* KarhooAddressSearchBarPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A5B95F25C1982200986616 /* KarhooAddressSearchBarPresenterSpec.swift */; }; + 14707C9325D54C2200CAD083 /* MockPickupOnlyStrategyDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D5221E5117C003E840C /* MockPickupOnlyStrategyDelegate.swift */; }; + 14707C9425D54C2200CAD083 /* RideCellStackButtonPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F472211D34000FB6BB5 /* RideCellStackButtonPresenterSpec.swift */; }; + 14707C9525D54C2200CAD083 /* MockTripsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F6C2211D76100FB6BB5 /* MockTripsProvider.swift */; }; + 14707C9625D54C2200CAD083 /* CLLocationCoordinate2D+Equatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094954592201C1ED00D930C0 /* CLLocationCoordinate2D+Equatable.swift */; }; + 14707C9725D54C2200CAD083 /* MockThreeDSecureProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094B764522CE734D00326CE1 /* MockThreeDSecureProvider.swift */; }; + 14707C9825D54C2200CAD083 /* MockTripAllocationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A5B95625C1941C00986616 /* MockTripAllocationView.swift */; }; + 14707C9925D54C2200CAD083 /* MockFeedbackScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D8B29522F444AA00569C55 /* MockFeedbackScreenBuilder.swift */; }; + 14707C9A25D54C2200CAD083 /* EmptyBookingMapStrategySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C8316BE246AE84900BAA926 /* EmptyBookingMapStrategySpec.swift */; }; + 14707C9B25D54C2200CAD083 /* PickupOnlyStrategySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6B21E5118A003E840C /* PickupOnlyStrategySpec.swift */; }; + 14707C9C25D54C2200CAD083 /* MockQuoteService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0949544221FF5F0800D930C0 /* MockQuoteService.swift */; }; + 14707C9D25D54C2200CAD083 /* MockMapViewActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2F2221EEDF6008FE26D /* MockMapViewActions.swift */; }; + 14707C9E25D54C2200CAD083 /* MockTimeSinceNowProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 090F08DF21C934EB000C7E50 /* MockTimeSinceNowProvider.swift */; }; + 14707C9F25D54C2200CAD083 /* MockRecentAddressProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09ED7B1D21C2A81200CF6D73 /* MockRecentAddressProvider.swift */; }; + 14707CA025D54C2200CAD083 /* KarhooTripRatingCacheSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 095D7457231827B4002253C0 /* KarhooTripRatingCacheSpec.swift */; }; + 14707CA125D54C2200CAD083 /* AdyenCardRegistrationFlowSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A5B98725C1B3A300986616 /* AdyenCardRegistrationFlowSpec.swift */; }; + 14707CA325D54C2200CAD083 /* KarhooTripMetaDataPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F482211D34000FB6BB5 /* KarhooTripMetaDataPresenterSpec.swift */; }; + 14707CA425D54C2200CAD083 /* MockKarhooPaymentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C20976F244475660097BA3A /* MockKarhooPaymentView.swift */; }; + 14707CA525D54C2200CAD083 /* TripSummaryInfoViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2E8221EED8F008FE26D /* TripSummaryInfoViewModelSpec.swift */; }; + 14707CA625D54C2200CAD083 /* FlightNumberValidatorSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09AAEF9521C4270800A04EEC /* FlightNumberValidatorSpec.swift */; }; + 14707CA725D54C2200CAD083 /* CancelRideBehaviourSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B30F5A224CE8BF007768CF /* CancelRideBehaviourSpec.swift */; }; + 14707CA825D54C2200CAD083 /* MockRideDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F5A2211D3D700FB6BB5 /* MockRideDetailsView.swift */; }; + 14707CA925D54C2200CAD083 /* MockTripMetaDataView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F592211D3D700FB6BB5 /* MockTripMetaDataView.swift */; }; + 14707CAA25D54C2200CAD083 /* MockTripFeedbackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968D82722F8649900047FCF /* MockTripFeedbackView.swift */; }; + 14707CAB25D54C2200CAD083 /* KarhooCardRegistrationFlowSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F532216D307006C48F2 /* KarhooCardRegistrationFlowSpec.swift */; }; + 14707CAC25D54C2200CAD083 /* KarhooAddressMapPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E68325237972C000BFF5B9 /* KarhooAddressMapPresenterSpec.swift */; }; + 14707CAD25D54C2200CAD083 /* MockRidesListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F652211D3DD00FB6BB5 /* MockRidesListView.swift */; }; + 14707CAE25D54C2200CAD083 /* MockTimeFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E302221EF0B9008FE26D /* MockTimeFetcher.swift */; }; + 14707CAF25D54C2200CAD083 /* TripInfoUtilitySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13583B21D64D52005054AE /* TripInfoUtilitySpec.swift */; }; + 14707CB025D54C2200CAD083 /* KarhooPaymentPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40D741AC22C676C20003B09B /* KarhooPaymentPresenterSpec.swift */; }; + 14707CB125D54C2200CAD083 /* TripMetaDataViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F772211DC5600FB6BB5 /* TripMetaDataViewModelSpec.swift */; }; + 14707CB225D54C2200CAD083 /* KarhooBookingPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6021E5118A003E840C /* KarhooBookingPresenterSpec.swift */; }; + 14707CB325D54C2200CAD083 /* MockAnalyticsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 407EC7EF22CF93DC00F24CFC /* MockAnalyticsService.swift */; }; + 14707CB425D54C2200CAD083 /* MockRidesScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C4397CF22615F37006BC6C4 /* MockRidesScreenBuilder.swift */; }; + 14707CB525D54C2200CAD083 /* MockRideDetailsStackButtonActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F5B2211D3D700FB6BB5 /* MockRideDetailsStackButtonActions.swift */; }; + 14707CB725D54C2200CAD083 /* TripFeedbackPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968D82422F82F8C00047FCF /* TripFeedbackPresenterSpec.swift */; }; + 14707CB825D54C2200CAD083 /* MockAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0E521BE7FF100745370 /* MockAddressView.swift */; }; + 14707CB925D54C2200CAD083 /* MockPrebookConfirmationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1C0D220884CC00C3AD1D /* MockPrebookConfirmationView.swift */; }; + 14707CBA25D54C2200CAD083 /* TestBroadcaster.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F86F7F222D60AB008C86DE /* TestBroadcaster.swift */; }; + 14707CBB25D54C2200CAD083 /* MockAddressSearchProviderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0E821BE7FF100745370 /* MockAddressSearchProviderDelegate.swift */; }; + 14707CBC25D54C2200CAD083 /* MockFlightDetailsScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F432216D0BB006C48F2 /* MockFlightDetailsScreenBuilder.swift */; }; + 14707CBD25D54C2200CAD083 /* PrebookConfirmationViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1C0122087CA600C3AD1D /* PrebookConfirmationViewModelSpec.swift */; }; + 14707CBE25D54C2200CAD083 /* MockBookingDetailsObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F86F85222D8553008C86DE /* MockBookingDetailsObserver.swift */; }; + 14707CBF25D54C2200CAD083 /* UnitTestSetup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 096192F521BEAB9C0052B71C /* UnitTestSetup.swift */; }; + 14707CC025D54C2200CAD083 /* MockFeedbackMailComposter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F712211D7F500FB6BB5 /* MockFeedbackMailComposter.swift */; }; + 14707CC125D54C2200CAD083 /* KarhooGuestBookingRequestPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4038DF43244617960014539B /* KarhooGuestBookingRequestPresenterSpec.swift */; }; + 14707CC225D54C2200CAD083 /* CurrencyCodeConverterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A5B96A25C19BEE00986616 /* CurrencyCodeConverterSpec.swift */; }; + 14707CC325D54C2200CAD083 /* MockQuoteCategoryBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D4E21E5117C003E840C /* MockQuoteCategoryBarView.swift */; }; + 14707CC425D54C2200CAD083 /* QtaStringFormatterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D293C322C651C10051C455 /* QtaStringFormatterSpec.swift */; }; + 14707CC525D54C2200CAD083 /* PopupDialogPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC04659722148912004E76FE /* PopupDialogPresenterSpec.swift */; }; + 14707CC625D54C2200CAD083 /* TripAddressBarPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2DC221EECAF008FE26D /* TripAddressBarPresenterSpec.swift */; }; + 14707CC725D54C2200CAD083 /* KarhooTripAllocationPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D6321E5118A003E840C /* KarhooTripAllocationPresenterSpec.swift */; }; + 14707CC825D54C2200CAD083 /* MockError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F10621BE885100745370 /* MockError.swift */; }; + 14707CC925D54C2200CAD083 /* MockTripSummaryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2EE221EEDDE008FE26D /* MockTripSummaryView.swift */; }; + 14707CCA25D54C2200CAD083 /* MockURLOpener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3C671024603B5700C736E9 /* MockURLOpener.swift */; }; + 14707CCB25D54C2200CAD083 /* MockAppStateNotifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F86F83222D84A8008C86DE /* MockAppStateNotifier.swift */; }; + 14707CCC25D54C2200CAD083 /* MockBookingStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097050A421FF0AF300E53AD2 /* MockBookingStatus.swift */; }; + 14707CCD25D54C2200CAD083 /* MockTripView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2F1221EEDF6008FE26D /* MockTripView.swift */; }; + 14707CCE25D54C2200CAD083 /* TripsListSorterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B30F5B224CE8BF007768CF /* TripsListSorterSpec.swift */; }; + 14707CCF25D54C2200CAD083 /* KarhooDestinationEtaPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2D2221EEC93008FE26D /* KarhooDestinationEtaPresenterSpec.swift */; }; + 14707CD025D54C2200CAD083 /* MockQuoteListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D4C21E5117C003E840C /* MockQuoteListView.swift */; }; + 14707CD125D54C2200CAD083 /* MockTripMetaDataActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F5D2211D3D700FB6BB5 /* MockTripMetaDataActions.swift */; }; + 14707CD225D54C2200CAD083 /* MockQuoteSorter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 145EC6F225C98CC800F1FC94 /* MockQuoteSorter.swift */; }; + 14707CD325D54C2200CAD083 /* MockBookingAllocationSpinnerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E35D4921E5117C003E840C /* MockBookingAllocationSpinnerView.swift */; }; + 14707CD425D54C2200CAD083 /* BraintreeThreeDSecureProviderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094B763F22CE729400326CE1 /* BraintreeThreeDSecureProviderSpec.swift */; }; + 14707CD525D54C2200CAD083 /* MockKarhooPollExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0F721BE850F00745370 /* MockKarhooPollExecutor.swift */; }; + 14707CD625D54C2200CAD083 /* BraintreePaymentNonceProviderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094B763D22CE729300326CE1 /* BraintreePaymentNonceProviderSpec.swift */; }; + 14707CD725D54C2200CAD083 /* MockSideMenuHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097800A3226F1FE5008772E4 /* MockSideMenuHandler.swift */; }; + 14707CD825D54C2200CAD083 /* TestUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0968F0EE21BE816F00745370 /* TestUtil.swift */; }; + 14707CD925D54C2200CAD083 /* MockPhoneNumberCaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094954562201C13E00D930C0 /* MockPhoneNumberCaller.swift */; }; + 14707CDA25D54C2200CAD083 /* MockRideDetailsScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC4B92EC222E982400FE33B4 /* MockRideDetailsScreenBuilder.swift */; }; + 14707CDB25D54C2200CAD083 /* KarhooRidesListPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F4A2211D34000FB6BB5 /* KarhooRidesListPresenterSpec.swift */; }; + 14707CDC25D54C2200CAD083 /* MockPopupDialogScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F12DC82232ABD30024D6E9 /* MockPopupDialogScreenBuilder.swift */; }; + 14707CDD25D54C2200CAD083 /* FlightDetailsPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BDD19721C2CBCF0074421C /* FlightDetailsPresenterSpec.swift */; }; + 14707CDE25D54C2200CAD083 /* PrebookConfirmationFormatterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1C0022087CA600C3AD1D /* PrebookConfirmationFormatterSpec.swift */; }; + 14707CDF25D54C2200CAD083 /* MockTripSummaryScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E30C221F18F3008FE26D /* MockTripSummaryScreenBuilder.swift */; }; + 14A5B93325C1823C00986616 /* KarhooConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A5B93225C1823C00986616 /* KarhooConfig.swift */; }; 23391EAC22C65525007D704E /* AddressCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23391EAB22C65525007D704E /* AddressCellViewModel.swift */; }; 2396A2AB255566DC007BD9E1 /* JourneyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2396A2AA255566DC007BD9E1 /* JourneyInfo.swift */; }; 2A9BC10FB50E39DBB73C43FF /* Pods_Client.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FF975DAE636DFA8CA47C6F2 /* Pods_Client.framework */; }; @@ -217,7 +300,6 @@ 4038DF3D2444C6E00014539B /* KarhooPhoneInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4038DF3C2444C6E00014539B /* KarhooPhoneInputView.swift */; }; 4038DF3F2444D6810014539B /* KarhooInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4038DF3E2444D6810014539B /* KarhooInputView.swift */; }; 4038DF422445D5340014539B /* KarhooPhoneInputViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4038DF412445D5340014539B /* KarhooPhoneInputViewDataSource.swift */; }; - 4038DF44244617960014539B /* KarhooGuestBookingRequestPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4038DF43244617960014539B /* KarhooGuestBookingRequestPresenterSpec.swift */; }; 403E907922C5287F00F39B91 /* KarhooPaymentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403E907822C5287F00F39B91 /* KarhooPaymentView.swift */; }; 403F448222F19A38008147FC /* BaseStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403F448122F19A38008147FC /* BaseStackView.swift */; }; 403F448422F1EC92008147FC /* KarhooTripFeedbackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403F448322F1EC92008147FC /* KarhooTripFeedbackViewController.swift */; }; @@ -292,15 +374,11 @@ 407EC7EA22CF564E00F24CFC /* TableDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 407EC79122CF564E00F24CFC /* TableDataSource.swift */; }; 407EC7EB22CF564E00F24CFC /* TableDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 407EC79222CF564E00F24CFC /* TableDelegate.swift */; }; 407EC7EC22CF564E00F24CFC /* TableData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 407EC79322CF564E00F24CFC /* TableData.swift */; }; - 407EC7F022CF93DC00F24CFC /* MockAnalyticsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 407EC7EF22CF93DC00F24CFC /* MockAnalyticsService.swift */; }; 407FC5F622F0A46800F74D0A /* HintTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 407FC5F522F0A46800F74D0A /* HintTextView.swift */; }; - 408AB683234F418B00B351B2 /* MockFareService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 408AB682234F418B00B351B2 /* MockFareService.swift */; }; 408AB68523507DF600B351B2 /* FareExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 408AB68423507DF600B351B2 /* FareExt.swift */; }; 40A2851F22B2476F0020D78F /* QuoteViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40A2851E22B2476F0020D78F /* QuoteViewModel.swift */; }; - 40A2852122B253870020D78F /* QuoteCellViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40A2852022B253870020D78F /* QuoteCellViewModelSpec.swift */; }; 40C1CD7223C9EC7900EDEA84 /* TripStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40C1CD7123C9EC7900EDEA84 /* TripStatusView.swift */; }; 40C7DC5B23D0A13500975AD3 /* MetaDataView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40C7DC5A23D0A13500975AD3 /* MetaDataView.swift */; }; - 40D741AD22C676C20003B09B /* KarhooPaymentPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40D741AC22C676C20003B09B /* KarhooPaymentPresenterSpec.swift */; }; 40E54AC42460DF9D00D13E10 /* KarhooAddCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40E54AC32460DF9D00D13E10 /* KarhooAddCardView.swift */; }; 40E6693523D5B99E00DE63BA /* RideDetailsViewContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40E6693423D5B99E00DE63BA /* RideDetailsViewContainer.swift */; }; 40FE0CEA22D7D28B003F65B5 /* RateButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40FE0CE922D7D28B003F65B5 /* RateButton.swift */; }; @@ -308,12 +386,10 @@ 40FE0CF022D7D31A003F65B5 /* KarhooRatingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40FE0CEF22D7D31A003F65B5 /* KarhooRatingView.swift */; }; 40FE0CF222D7D333003F65B5 /* KarhooRatingPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40FE0CF122D7D333003F65B5 /* KarhooRatingPresenter.swift */; }; 5C089DF82507A2E100B3D4CA /* AdyenCardRegistrationFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C089DF72507A2E100B3D4CA /* AdyenCardRegistrationFlow.swift */; }; - 5C089DFA2507C9F000B3D4CA /* AdyenCardRegistrationFlowSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C089DF92507C9F000B3D4CA /* AdyenCardRegistrationFlowSpec.swift */; }; 5C1B298725247E4F00E3CEEF /* AdyenPaymentNonceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1B298625247E4E00E3CEEF /* AdyenPaymentNonceProvider.swift */; }; 5C1CD0B0241A5D88004AFF7D /* TripOptionsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1CD0A1241A5D88004AFF7D /* TripOptionsViewModel.swift */; }; 5C1CD0B1241A5D88004AFF7D /* KarhooTripOptionsPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1CD0A3241A5D88004AFF7D /* KarhooTripOptionsPresenter.swift */; }; 5C1CD0B2241A5D88004AFF7D /* TripOptionsMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1CD0A4241A5D88004AFF7D /* TripOptionsMVP.swift */; }; - 5C1CD0B3241A5D88004AFF7D /* TripActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1CD0A5241A5D88004AFF7D /* TripActionsView.swift */; }; 5C1CD0B4241A5D88004AFF7D /* KarhooDriverDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1CD0A7241A5D88004AFF7D /* KarhooDriverDetailsView.swift */; }; 5C1CD0B5241A5D88004AFF7D /* DriverDetailsMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1CD0A8241A5D88004AFF7D /* DriverDetailsMVP.swift */; }; 5C1CD0B6241A5D88004AFF7D /* KarhooDriverDetailsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5C1CD0A9241A5D88004AFF7D /* KarhooDriverDetailsView.xib */; }; @@ -322,16 +398,13 @@ 5C1CD0BA241A5D88004AFF7D /* KarhooTripDetailsPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1CD0AE241A5D88004AFF7D /* KarhooTripDetailsPresenter.swift */; }; 5C1CD0BB241A5D88004AFF7D /* TripScreenDetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1CD0AF241A5D88004AFF7D /* TripScreenDetailsViewModel.swift */; }; 5C1CD0BF241A8DB8004AFF7D /* KarhooTripDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1CD0BE241A8DB8004AFF7D /* KarhooTripDetailsView.swift */; }; - 5C209770244475660097BA3A /* MockKarhooPaymentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C20976F244475660097BA3A /* MockKarhooPaymentView.swift */; }; 5C2E26102420F8AC00B1FF0C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260F2420F8AC00B1FF0C /* AppDelegate.swift */; }; 5C2E26122420F8AC00B1FF0C /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E26112420F8AC00B1FF0C /* SceneDelegate.swift */; }; 5C2E26142420F8AC00B1FF0C /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E26132420F8AC00B1FF0C /* ViewController.swift */; }; 5C2E26192420F8AD00B1FF0C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5C2E26182420F8AD00B1FF0C /* Assets.xcassets */; }; 5C2E261C2420F8AD00B1FF0C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5C2E261A2420F8AD00B1FF0C /* LaunchScreen.storyboard */; }; 5C3C66B724468B7800C736E9 /* KarhooPaymentMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3C66B624468B7800C736E9 /* KarhooPaymentMVP.swift */; }; - 5C3C671124603B5700C736E9 /* MockURLOpener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3C671024603B5700C736E9 /* MockURLOpener.swift */; }; 5C4252592518D06000CCCB5D /* CardRegistrationFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C4252582518D06000CCCB5D /* CardRegistrationFlow.swift */; }; - 5C4397D022615F37006BC6C4 /* MockRidesScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C4397CF22615F37006BC6C4 /* MockRidesScreenBuilder.swift */; }; 5C6267EA252CC24500AB6CD2 /* PaymentFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6267E9252CC24500AB6CD2 /* PaymentFactory.swift */; }; 5C626861252DFC0A00AB6CD2 /* AdyenResponseHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C626860252DFC0A00AB6CD2 /* AdyenResponseHandler.swift */; }; 5C7233C0226510B9001078B6 /* KarhooUISDKError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7233BF226510B9001078B6 /* KarhooUISDKError.swift */; }; @@ -340,10 +413,7 @@ 5C7F6EF1233A375F0039F3E2 /* BaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7F6EF0233A375F0039F3E2 /* BaseView.swift */; }; 5C831686246218E700BAA926 /* KarhooComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C831685246218E700BAA926 /* KarhooComponents.swift */; }; 5C8316BB246A0B6200BAA926 /* EmptyMapBookingStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C8316BA246A0B6200BAA926 /* EmptyMapBookingStrategy.swift */; }; - 5C8316BF246AE84900BAA926 /* EmptyBookingMapStrategySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C8316BE246AE84900BAA926 /* EmptyBookingMapStrategySpec.swift */; }; 5C8316C1246B6D0700BAA926 /* SharedPassengerDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C8316C0246B6D0700BAA926 /* SharedPassengerDetails.swift */; }; - 5C9D9918242CEBC4004F1DBD /* MockAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9D9917242CEBC3004F1DBD /* MockAnalytics.swift */; }; - 5C9D991A242CED15004F1DBD /* MockAddressService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9D9919242CED15004F1DBD /* MockAddressService.swift */; }; 5CBA2A7424F5D8CC0091D783 /* BookingRequestMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBA2A6024F5D8CC0091D783 /* BookingRequestMVP.swift */; }; 5CBA2A7524F5D8CC0091D783 /* FormBookingRequestViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBA2A6224F5D8CC0091D783 /* FormBookingRequestViewController.swift */; }; 5CBA2A7624F5D8CC0091D783 /* FormBookingRequestPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBA2A6324F5D8CC0091D783 /* FormBookingRequestPresenter.swift */; }; @@ -358,7 +428,6 @@ 5CBA2A7F24F5D8CC0091D783 /* KarhooTimePriceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBA2A7124F5D8CC0091D783 /* KarhooTimePriceView.swift */; }; 5CBA2A8024F5D8CC0091D783 /* TimePriceMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBA2A7224F5D8CC0091D783 /* TimePriceMVP.swift */; }; 5CBA2A8124F5D8CC0091D783 /* KarhooTimePriceView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5CBA2A7324F5D8CC0091D783 /* KarhooTimePriceView.xib */; }; - 5CBE369524EAB99500C7B204 /* Keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CBE369424EAB99400C7B204 /* Keys.swift */; }; 5CC253712441FD4000603D84 /* PaymentMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC253702441FD4000603D84 /* PaymentMethod.swift */; }; 5CD9CFAA22DCAB580086E7A0 /* RatingViewMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CD9CFA922DCAB580086E7A0 /* RatingViewMVP.swift */; }; 5CDACF2E23CCAC8700FD4F56 /* KarhooMKMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CDACF2D23CCAC8700FD4F56 /* KarhooMKMapView.swift */; }; @@ -367,19 +436,16 @@ 6F4235BF2391800C00233C02 /* AddressGoogleLogoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F4235BE2391800C00233C02 /* AddressGoogleLogoView.swift */; }; 6F89EA0D248E5CA300F47C1B /* KarhooAddressDisplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F89EA0C248E5CA300F47C1B /* KarhooAddressDisplayView.swift */; }; 986578A0F928780978136BC5 /* RidesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 986573E003E549DB4C06EA7A /* RidesViewController.xib */; }; + A1A0312626171A4E00B01E1F /* KarhooQuoteListPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1A0312526171A4E00B01E1F /* KarhooQuoteListPresenterSpec.swift */; }; + AE4AC8A425F12C28000F9E57 /* AdyenThreeDSecureUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4AC8A325F12C28000F9E57 /* AdyenThreeDSecureUtils.swift */; }; + D8263F4E262096C30042F259 /* TimeFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8263F4D262096C30042F259 /* TimeFormatter.swift */; }; + D88BC2862620C51C00F1EA60 /* TimeFormatterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = D88BC2852620C51C00F1EA60 /* TimeFormatterSpec.swift */; }; + D8D8ED2A261F1FDA0061066D /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = D8D8ED2D261F1FDA0061066D /* Localizable.stringsdict */; }; + D8D8ED2B261F1FDA0061066D /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = D8D8ED2D261F1FDA0061066D /* Localizable.stringsdict */; }; FC046595221484E2004E76FE /* RideDetailsScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC046594221484E2004E76FE /* RideDetailsScreenBuilder.swift */; }; - FC04659822148912004E76FE /* PopupDialogPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC04659722148912004E76FE /* PopupDialogPresenterSpec.swift */; }; FC04659F2215A6AD004E76FE /* Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC04659E2215A6AD004E76FE /* Navigation.swift */; }; FC0465A12215A962004E76FE /* UINavigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC0465A02215A962004E76FE /* UINavigation.swift */; }; FC0465A52215AA05004E76FE /* NavigationControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC0465A42215AA05004E76FE /* NavigationControllerDelegate.swift */; }; - FC13583C21D64D52005054AE /* TripInfoUtilitySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13583B21D64D52005054AE /* TripInfoUtilitySpec.swift */; }; - FC13583F21D64E18005054AE /* BookingDetailsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13583E21D64E18005054AE /* BookingDetailsSpec.swift */; }; - FC13584321D64E8C005054AE /* ResizingSwitcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13584121D64E8C005054AE /* ResizingSwitcherTests.swift */; }; - FC13584421D64E8C005054AE /* DefaultConstraintSwitcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13584221D64E8C005054AE /* DefaultConstraintSwitcherTests.swift */; }; - FC13584721D64F66005054AE /* KarhooBookingRequestPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13584621D64F66005054AE /* KarhooBookingRequestPresenterSpec.swift */; }; - FC13584B21D6752F005054AE /* MockBookingRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13584A21D6752F005054AE /* MockBookingRequestView.swift */; }; - FC13584E21D6785C005054AE /* MockUserService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13584D21D6785C005054AE /* MockUserService.swift */; }; - FC13585221D67971005054AE /* MockTripService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC13585121D67971005054AE /* MockTripService.swift */; }; FC435EEA2211B33B00FB6BB5 /* KarhooRidesPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435EE52211B33B00FB6BB5 /* KarhooRidesPresenter.swift */; }; FC435EEC2211B33B00FB6BB5 /* RidesMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435EE72211B33B00FB6BB5 /* RidesMVP.swift */; }; FC435EED2211B33B00FB6BB5 /* RidesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435EE82211B33B00FB6BB5 /* RidesViewController.swift */; }; @@ -406,44 +472,8 @@ FC435F3E2211BA1700FB6BB5 /* KarhooTripsSorter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F3C2211BA1700FB6BB5 /* KarhooTripsSorter.swift */; }; FC435F422211BB5900FB6BB5 /* TimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F412211BB5900FB6BB5 /* TimeScheduler.swift */; }; FC435F442211BB8B00FB6BB5 /* KarhooTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F432211BB8B00FB6BB5 /* KarhooTimeScheduler.swift */; }; - FC435F4C2211D34100FB6BB5 /* KarhooRidesPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F462211D34000FB6BB5 /* KarhooRidesPresenterSpec.swift */; }; - FC435F4D2211D34100FB6BB5 /* RideCellStackButtonPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F472211D34000FB6BB5 /* RideCellStackButtonPresenterSpec.swift */; }; - FC435F4E2211D34100FB6BB5 /* KarhooTripMetaDataPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F482211D34000FB6BB5 /* KarhooTripMetaDataPresenterSpec.swift */; }; - FC435F4F2211D34100FB6BB5 /* KarhooRideDetailsPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F492211D34000FB6BB5 /* KarhooRideDetailsPresenterSpec.swift */; }; - FC435F502211D34100FB6BB5 /* KarhooRidesListPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F4A2211D34000FB6BB5 /* KarhooRidesListPresenterSpec.swift */; }; - FC435F512211D34100FB6BB5 /* RideDetailsStackButtonPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F4B2211D34100FB6BB5 /* RideDetailsStackButtonPresenterSpec.swift */; }; - FC435F562211D38F00FB6BB5 /* MockRidesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F542211D38E00FB6BB5 /* MockRidesView.swift */; }; - FC435F5F2211D3D700FB6BB5 /* MockTripMetaDataView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F592211D3D700FB6BB5 /* MockTripMetaDataView.swift */; }; - FC435F602211D3D700FB6BB5 /* MockRideDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F5A2211D3D700FB6BB5 /* MockRideDetailsView.swift */; }; - FC435F612211D3D700FB6BB5 /* MockRideDetailsStackButtonActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F5B2211D3D700FB6BB5 /* MockRideDetailsStackButtonActions.swift */; }; - FC435F632211D3D700FB6BB5 /* MockTripMetaDataActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F5D2211D3D700FB6BB5 /* MockTripMetaDataActions.swift */; }; - FC435F642211D3D700FB6BB5 /* MockRideCellStackButtonActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F5E2211D3D700FB6BB5 /* MockRideCellStackButtonActions.swift */; }; - FC435F672211D3DD00FB6BB5 /* MockRidesListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F652211D3DD00FB6BB5 /* MockRidesListView.swift */; }; - FC435F682211D3DD00FB6BB5 /* MockRidesListActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F662211D3DD00FB6BB5 /* MockRidesListActions.swift */; }; - FC435F6A2211D67200FB6BB5 /* MockCancelRideBehaviour.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F692211D67200FB6BB5 /* MockCancelRideBehaviour.swift */; }; - FC435F6D2211D76100FB6BB5 /* MockTripsSorter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F6B2211D76100FB6BB5 /* MockTripsSorter.swift */; }; - FC435F6E2211D76100FB6BB5 /* MockTripsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F6C2211D76100FB6BB5 /* MockTripsProvider.swift */; }; - FC435F702211D7AF00FB6BB5 /* MockStackButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F6F2211D7AF00FB6BB5 /* MockStackButtonView.swift */; }; - FC435F722211D7F500FB6BB5 /* MockFeedbackMailComposter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F712211D7F500FB6BB5 /* MockFeedbackMailComposter.swift */; }; - FC435F782211DC5600FB6BB5 /* TripMetaDataViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F772211DC5600FB6BB5 /* TripMetaDataViewModelSpec.swift */; }; FC435F7A2211DDB400FB6BB5 /* RideCellViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F792211DDB400FB6BB5 /* RideCellViewModelSpec.swift */; }; - FC435F862211E26400FB6BB5 /* KarhooTripsProviderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F852211E26400FB6BB5 /* KarhooTripsProviderSpec.swift */; }; - FC435F882211E2C100FB6BB5 /* BookingStatusViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F872211E2C100FB6BB5 /* BookingStatusViewModelSpec.swift */; }; - FC435F8A2211E30400FB6BB5 /* TripDetailsViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F892211E30400FB6BB5 /* TripDetailsViewModelSpec.swift */; }; - FC435F8E2211E3FB00FB6BB5 /* MockTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC435F8D2211E3FA00FB6BB5 /* MockTimeScheduler.swift */; }; FC45D6D817F54C9C62E8B7A0 /* Pods_KarhooUISDKTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA979AB3B77F9708C97C2E84 /* Pods_KarhooUISDKTests.framework */; }; - FC4B92ED222E982400FE33B4 /* MockRideDetailsScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC4B92EC222E982400FE33B4 /* MockRideDetailsScreenBuilder.swift */; }; - FC658F482216D0BB006C48F2 /* MockDatePickerScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F422216D0BB006C48F2 /* MockDatePickerScreenBuilder.swift */; }; - FC658F492216D0BB006C48F2 /* MockFlightDetailsScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F432216D0BB006C48F2 /* MockFlightDetailsScreenBuilder.swift */; }; - FC658F4B2216D0BB006C48F2 /* MockPrebookConfirmationScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F452216D0BB006C48F2 /* MockPrebookConfirmationScreenBuilder.swift */; }; - FC658F4C2216D0BB006C48F2 /* MockBookingRequestScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F462216D0BB006C48F2 /* MockBookingRequestScreenBuilder.swift */; }; - FC658F4D2216D0BB006C48F2 /* MockAddressScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F472216D0BB006C48F2 /* MockAddressScreenBuilder.swift */; }; - FC658F552216D308006C48F2 /* KarhooCardRegistrationFlowSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F532216D307006C48F2 /* KarhooCardRegistrationFlowSpec.swift */; }; - FC658F572216D4FC006C48F2 /* MockNavigationItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F562216D4FC006C48F2 /* MockNavigationItem.swift */; }; - FC658F5D2216D5AE006C48F2 /* MockCardRegistrationFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F5C2216D5AE006C48F2 /* MockCardRegistrationFlow.swift */; }; - FC658F622216D9C1006C48F2 /* MockPaymentService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F612216D9C1006C48F2 /* MockPaymentService.swift */; }; - FC658F712216F8B7006C48F2 /* MockPaymentScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F702216F8B7006C48F2 /* MockPaymentScreenBuilder.swift */; }; - FC658F80221726C8006C48F2 /* UINavigationSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC658F7F221726C8006C48F2 /* UINavigationSpec.swift */; }; FC705B0D2212DE6E0001036E /* RidesScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC705B0C2212DE6E0001036E /* RidesScreenBuilder.swift */; }; FC705B0F22130B990001036E /* RidesListScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC705B0E22130B990001036E /* RidesListScreenBuilder.swift */; }; FC705B15221321650001036E /* PopupDialogScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC705B14221321650001036E /* PopupDialogScreenBuilder.swift */; }; @@ -478,26 +508,6 @@ FC83E2AD221EE890008FE26D /* TimeFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2AC221EE890008FE26D /* TimeFetcher.swift */; }; FC83E2B1221EE920008FE26D /* DebugLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2AE221EE909008FE26D /* DebugLogger.swift */; }; FC83E2B2221EE920008FE26D /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2AF221EE909008FE26D /* Logger.swift */; }; - FC83E2D3221EEC93008FE26D /* KarhooDestinationEtaPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2D2221EEC93008FE26D /* KarhooDestinationEtaPresenterSpec.swift */; }; - FC83E2D7221EEC9E008FE26D /* TripScreenDetailsViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2D4221EEC9E008FE26D /* TripScreenDetailsViewModelSpec.swift */; }; - FC83E2D8221EEC9E008FE26D /* KarhooTripDetailsPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2D5221EEC9E008FE26D /* KarhooTripDetailsPresenterSpec.swift */; }; - FC83E2D9221EEC9E008FE26D /* KarhooTripPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2D6221EEC9E008FE26D /* KarhooTripPresenterSpec.swift */; }; - FC83E2DB221EECA9008FE26D /* KarhooOriginEtaPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2DA221EECA8008FE26D /* KarhooOriginEtaPresenterSpec.swift */; }; - FC83E2DE221EECB0008FE26D /* TripAddressBarPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2DC221EECAF008FE26D /* TripAddressBarPresenterSpec.swift */; }; - FC83E2DF221EECB0008FE26D /* TripMapPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2DD221EECB0008FE26D /* TripMapPresenterSpec.swift */; }; - FC83E2E9221EED8F008FE26D /* TripSummaryInfoViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2E8221EED8F008FE26D /* TripSummaryInfoViewModelSpec.swift */; }; - FC83E2EB221EED94008FE26D /* KarhooTripSummaryPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2EA221EED94008FE26D /* KarhooTripSummaryPresenterSpec.swift */; }; - FC83E2EF221EEDDE008FE26D /* MockTripSummaryInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2ED221EEDDE008FE26D /* MockTripSummaryInfoView.swift */; }; - FC83E2F0221EEDDE008FE26D /* MockTripSummaryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2EE221EEDDE008FE26D /* MockTripSummaryView.swift */; }; - FC83E2F4221EEDF6008FE26D /* MockTripView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2F1221EEDF6008FE26D /* MockTripView.swift */; }; - FC83E2F5221EEDF6008FE26D /* MockMapViewActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2F2221EEDF6008FE26D /* MockMapViewActions.swift */; }; - FC83E2FB221EEE82008FE26D /* MockDestinationEtaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2FA221EEE82008FE26D /* MockDestinationEtaView.swift */; }; - FC83E2FD221EEE8A008FE26D /* MockTripScreenDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2FC221EEE8A008FE26D /* MockTripScreenDetailsView.swift */; }; - FC83E2FF221EEE94008FE26D /* MockOriginEtaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E2FE221EEE94008FE26D /* MockOriginEtaView.swift */; }; - FC83E301221EF042008FE26D /* MockDriverTrackingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E300221EF042008FE26D /* MockDriverTrackingService.swift */; }; - FC83E303221EF0B9008FE26D /* MockTimeFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E302221EF0B9008FE26D /* MockTimeFetcher.swift */; }; - FC83E30B221F1839008FE26D /* MockTripScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E30A221F1839008FE26D /* MockTripScreenBuilder.swift */; }; - FC83E30D221F18F3008FE26D /* MockTripSummaryScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC83E30C221F18F3008FE26D /* MockTripSummaryScreenBuilder.swift */; }; FC8CDD3D2208956E001F201B /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 090F08E821C94BB6000C7E50 /* Localizable.strings */; }; FC8F472521539E24007841FB /* KarhooUISDK.h in Headers */ = {isa = PBXBuildFile; fileRef = FC8F471721539E24007841FB /* KarhooUISDK.h */; settings = {ATTRIBUTES = (Public, ); }; }; FC8F47392153DBDE007841FB /* KarhooUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC8F47382153DBDE007841FB /* KarhooUI.swift */; }; @@ -508,22 +518,17 @@ FCAD1BFB22087BD800C3AD1D /* PrebookConfirmationMVP.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1BF622087BD700C3AD1D /* PrebookConfirmationMVP.swift */; }; FCAD1BFC22087BD800C3AD1D /* KarhooPrebookConfirmationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1BF722087BD700C3AD1D /* KarhooPrebookConfirmationViewController.swift */; }; FCAD1BFD22087BD800C3AD1D /* KarhooPrebookConfirmationPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1BF822087BD700C3AD1D /* KarhooPrebookConfirmationPresenter.swift */; }; - FCAD1C0222087CA700C3AD1D /* KarhooPrebookConfirmationPresenterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1BFF22087CA600C3AD1D /* KarhooPrebookConfirmationPresenterSpec.swift */; }; - FCAD1C0322087CA700C3AD1D /* PrebookConfirmationFormatterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1C0022087CA600C3AD1D /* PrebookConfirmationFormatterSpec.swift */; }; - FCAD1C0422087CA700C3AD1D /* PrebookConfirmationViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1C0122087CA600C3AD1D /* PrebookConfirmationViewModelSpec.swift */; }; FCAD1C0B2208816000C3AD1D /* PrebookConfirmationScreenBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1C0A2208816000C3AD1D /* PrebookConfirmationScreenBuilder.swift */; }; - FCAD1C0E220884CC00C3AD1D /* MockPrebookConfirmationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1C0D220884CC00C3AD1D /* MockPrebookConfirmationView.swift */; }; FCAD1C1422088A5300C3AD1D /* PrebookConfirmationFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCAD1C1322088A5200C3AD1D /* PrebookConfirmationFormatter.swift */; }; - FCF7E68F2226A76B00EEBF98 /* KarhooBookingStatusSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCF7E68E2226A76B00EEBF98 /* KarhooBookingStatusSpec.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 5C2E26212420F8B500B1FF0C /* PBXContainerItemProxy */ = { + 14707ADD25D54B5B00CAD083 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = FC8F470B21539E24007841FB /* Project object */; proxyType = 1; - remoteGlobalIDString = 5C2E260C2420F8AC00B1FF0C; - remoteInfo = Client; + remoteGlobalIDString = FC8F471321539E24007841FB; + remoteInfo = KarhooUISDK; }; /* End PBXContainerItemProxy section */ @@ -558,7 +563,6 @@ 0946CB5C21CBDF0400DBDD42 /* BookingRequestScreenBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookingRequestScreenBuilder.swift; sourceTree = ""; }; 0949543E21FF5A8800D930C0 /* MockBookingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockBookingView.swift; sourceTree = ""; }; 0949544221FF5F0800D930C0 /* MockQuoteService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockQuoteService.swift; sourceTree = ""; }; - 0949545221FF6FC800D930C0 /* MockAddressBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockAddressBarView.swift; sourceTree = ""; }; 0949545421FF7CDB00D930C0 /* MockKarhooMapView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockKarhooMapView.swift; sourceTree = ""; }; 094954562201C13E00D930C0 /* MockPhoneNumberCaller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockPhoneNumberCaller.swift; sourceTree = ""; }; 094954592201C1ED00D930C0 /* CLLocationCoordinate2D+Equatable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CLLocationCoordinate2D+Equatable.swift"; sourceTree = ""; }; @@ -599,7 +603,6 @@ 0968F0F821BE850F00745370 /* MockKarhooExecutable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockKarhooExecutable.swift; sourceTree = ""; }; 0968F0F921BE850F00745370 /* MockPollCall.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockPollCall.swift; sourceTree = ""; }; 0968F0FC21BE850F00745370 /* MockObservable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockObservable.swift; sourceTree = ""; }; - 0968F10421BE859400745370 /* MockAlertHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockAlertHandler.swift; sourceTree = ""; }; 0968F10621BE885100745370 /* MockError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockError.swift; sourceTree = ""; }; 0968F11121BEA6B700745370 /* MockAnalytics.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockAnalytics.swift; sourceTree = ""; }; 097050A421FF0AF300E53AD2 /* MockBookingStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockBookingStatus.swift; sourceTree = ""; }; @@ -687,12 +690,10 @@ 09C7659A21DE688000CD81AB /* BookingMVP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookingMVP.swift; sourceTree = ""; }; 09D293C322C651C10051C455 /* QtaStringFormatterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QtaStringFormatterSpec.swift; sourceTree = ""; }; 09D293C422C651C10051C455 /* KarhooDateFormatterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooDateFormatterSpec.swift; sourceTree = ""; }; - 09D293C522C651C10051C455 /* CurrencyCodeConverterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurrencyCodeConverterSpec.swift; sourceTree = ""; }; 09D8B29322F3491F00569C55 /* TripFeedbackScreenBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TripFeedbackScreenBuilder.swift; sourceTree = ""; }; 09D8B29522F444AA00569C55 /* MockFeedbackScreenBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockFeedbackScreenBuilder.swift; sourceTree = ""; }; 09DA1A3022F1A866004C6B20 /* FeedbackButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackButtonView.swift; sourceTree = ""; }; 09DA1A3222F1A8F4004C6B20 /* FeedbackButtonMVP.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackButtonMVP.swift; sourceTree = ""; }; - 09DCC7F021BE7CE000DF02B9 /* KarhooAddressSearchBarPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooAddressSearchBarPresenterSpec.swift; sourceTree = ""; }; 09DCC7F121BE7CE000DF02B9 /* KarhooAddressPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooAddressPresenterSpec.swift; sourceTree = ""; }; 09DCC7F321BE7CE000DF02B9 /* KarhooAddressSearchProviderSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooAddressSearchProviderSpec.swift; sourceTree = ""; }; 09DE8D45221C658B00451B3C /* BraintreePaymentScreensBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BraintreePaymentScreensBuilder.swift; sourceTree = ""; }; @@ -700,16 +701,13 @@ 09E0249F21C2D9FD0071E367 /* FlightNumberValidator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FlightNumberValidator.swift; sourceTree = ""; }; 09E1475421C7ED06003BB30B /* MockFlightDetailsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockFlightDetailsView.swift; sourceTree = ""; }; 09E35D4921E5117C003E840C /* MockBookingAllocationSpinnerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockBookingAllocationSpinnerView.swift; sourceTree = ""; }; - 09E35D4A21E5117C003E840C /* MockTripAllocationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockTripAllocationView.swift; sourceTree = ""; }; 09E35D4C21E5117C003E840C /* MockQuoteListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockQuoteListView.swift; sourceTree = ""; }; 09E35D4E21E5117C003E840C /* MockQuoteCategoryBarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockQuoteCategoryBarView.swift; sourceTree = ""; }; 09E35D5221E5117C003E840C /* MockPickupOnlyStrategyDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockPickupOnlyStrategyDelegate.swift; sourceTree = ""; }; - 09E35D5421E5117C003E840C /* MockQuoteSorter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockQuoteSorter.swift; sourceTree = ""; }; 09E35D5621E5117C003E840C /* MockQuoteSortView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockQuoteSortView.swift; sourceTree = ""; }; 09E35D6021E5118A003E840C /* KarhooBookingPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooBookingPresenterSpec.swift; sourceTree = ""; }; 09E35D6221E5118A003E840C /* BookingAllocationSpinnerPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookingAllocationSpinnerPresenterSpec.swift; sourceTree = ""; }; 09E35D6321E5118A003E840C /* KarhooTripAllocationPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooTripAllocationPresenterSpec.swift; sourceTree = ""; }; - 09E35D6521E5118A003E840C /* KarhooQuoteListPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooQuoteListPresenterSpec.swift; sourceTree = ""; }; 09E35D6721E5118A003E840C /* KarhooQuoteCategoryBarPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooQuoteCategoryBarPresenterSpec.swift; sourceTree = ""; }; 09E35D6921E5118A003E840C /* BookingMapPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookingMapPresenterSpec.swift; sourceTree = ""; }; 09E35D6A21E5118A003E840C /* DestinationSetStrategySpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DestinationSetStrategySpec.swift; sourceTree = ""; }; @@ -719,7 +717,6 @@ 09E683202374236100BFF5B9 /* KarhooAddressMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KarhooAddressMapView.swift; sourceTree = ""; }; 09E683222374522900BFF5B9 /* KarhooAddressMapPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KarhooAddressMapPresenter.swift; sourceTree = ""; }; 09E68325237972C000BFF5B9 /* KarhooAddressMapPresenterSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KarhooAddressMapPresenterSpec.swift; sourceTree = ""; }; - 09E683282379735B00BFF5B9 /* MockAddressMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockAddressMapView.swift; sourceTree = ""; }; 09EBC66922D612C600F1177E /* KarhooSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = KarhooSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 09ED7B1B21C2A7E000CF6D73 /* KarhooRecentAddressProviderSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KarhooRecentAddressProviderSpec.swift; sourceTree = ""; }; 09ED7B1D21C2A81200CF6D73 /* MockRecentAddressProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockRecentAddressProvider.swift; sourceTree = ""; }; @@ -731,6 +728,18 @@ 09F86F83222D84A8008C86DE /* MockAppStateNotifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockAppStateNotifier.swift; sourceTree = ""; }; 09F86F85222D8553008C86DE /* MockBookingDetailsObserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockBookingDetailsObserver.swift; sourceTree = ""; }; 1061B90ED3BAE79634610DAC /* Pods-KarhooUISDKTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KarhooUISDKTests.release.xcconfig"; path = "Target Support Files/Pods-KarhooUISDKTests/Pods-KarhooUISDKTests.release.xcconfig"; sourceTree = ""; }; + 1413303125DBDC3100EDAD3B /* Keys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Keys.swift; sourceTree = ""; }; + 145EC6F225C98CC800F1FC94 /* MockQuoteSorter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockQuoteSorter.swift; sourceTree = ""; }; + 14A5B93225C1823C00986616 /* KarhooConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KarhooConfig.swift; sourceTree = ""; }; + 14A5B95625C1941C00986616 /* MockTripAllocationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTripAllocationView.swift; sourceTree = ""; }; + 14A5B95F25C1982200986616 /* KarhooAddressSearchBarPresenterSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KarhooAddressSearchBarPresenterSpec.swift; sourceTree = ""; }; + 14A5B96A25C19BEE00986616 /* CurrencyCodeConverterSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencyCodeConverterSpec.swift; sourceTree = ""; }; + 14A5B97225C1AC7C00986616 /* MockAlertHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockAlertHandler.swift; sourceTree = ""; }; + 14A5B97A25C1AD4600986616 /* MockUserService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockUserService.swift; sourceTree = ""; }; + 14A5B98725C1B3A300986616 /* AdyenCardRegistrationFlowSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdyenCardRegistrationFlowSpec.swift; sourceTree = ""; }; + 14A5B99B25C1BB3500986616 /* MockAddressBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockAddressBarView.swift; sourceTree = ""; }; + 14A5B9AE25C1C61000986616 /* MockAddressMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockAddressMapView.swift; sourceTree = ""; }; + 14A5B9C625C1CFCB00986616 /* KarhooRideDetailsPresenterSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KarhooRideDetailsPresenterSpec.swift; sourceTree = ""; }; 23391EAB22C65525007D704E /* AddressCellViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddressCellViewModel.swift; sourceTree = ""; }; 2372675E70509D3779F8061D /* Pods-KarhooUISDKTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KarhooUISDKTests.debug.xcconfig"; path = "Target Support Files/Pods-KarhooUISDKTests/Pods-KarhooUISDKTests.debug.xcconfig"; sourceTree = ""; }; 2396A2AA255566DC007BD9E1 /* JourneyInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JourneyInfo.swift; sourceTree = ""; }; @@ -841,12 +850,10 @@ 424F848C513A1D30E2DC8308 /* Pods-KarhooUISDK.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KarhooUISDK.release.xcconfig"; path = "Target Support Files/Pods-KarhooUISDK/Pods-KarhooUISDK.release.xcconfig"; sourceTree = ""; }; 5A6218A52CFEDECA5CD3884E /* Pods-Client.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Client.release.xcconfig"; path = "Target Support Files/Pods-Client/Pods-Client.release.xcconfig"; sourceTree = ""; }; 5C089DF72507A2E100B3D4CA /* AdyenCardRegistrationFlow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdyenCardRegistrationFlow.swift; sourceTree = ""; }; - 5C089DF92507C9F000B3D4CA /* AdyenCardRegistrationFlowSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdyenCardRegistrationFlowSpec.swift; sourceTree = ""; }; 5C1B298625247E4E00E3CEEF /* AdyenPaymentNonceProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdyenPaymentNonceProvider.swift; sourceTree = ""; }; 5C1CD0A1241A5D88004AFF7D /* TripOptionsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TripOptionsViewModel.swift; sourceTree = ""; }; 5C1CD0A3241A5D88004AFF7D /* KarhooTripOptionsPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooTripOptionsPresenter.swift; sourceTree = ""; }; 5C1CD0A4241A5D88004AFF7D /* TripOptionsMVP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TripOptionsMVP.swift; sourceTree = ""; }; - 5C1CD0A5241A5D88004AFF7D /* TripActionsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TripActionsView.swift; sourceTree = ""; }; 5C1CD0A7241A5D88004AFF7D /* KarhooDriverDetailsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooDriverDetailsView.swift; sourceTree = ""; }; 5C1CD0A8241A5D88004AFF7D /* DriverDetailsMVP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DriverDetailsMVP.swift; sourceTree = ""; }; 5C1CD0A9241A5D88004AFF7D /* KarhooDriverDetailsView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KarhooDriverDetailsView.xib; sourceTree = ""; }; @@ -892,7 +899,6 @@ 5CBA2A7124F5D8CC0091D783 /* KarhooTimePriceView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooTimePriceView.swift; sourceTree = ""; }; 5CBA2A7224F5D8CC0091D783 /* TimePriceMVP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimePriceMVP.swift; sourceTree = ""; }; 5CBA2A7324F5D8CC0091D783 /* KarhooTimePriceView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KarhooTimePriceView.xib; sourceTree = ""; }; - 5CBE369424EAB99400C7B204 /* Keys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keys.swift; sourceTree = ""; }; 5CC253702441FD4000603D84 /* PaymentMethod.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentMethod.swift; sourceTree = ""; }; 5CD9CFA922DCAB580086E7A0 /* RatingViewMVP.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RatingViewMVP.swift; sourceTree = ""; }; 5CDACF2D23CCAC8700FD4F56 /* KarhooMKMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KarhooMKMapView.swift; sourceTree = ""; }; @@ -903,9 +909,16 @@ 986573E003E549DB4C06EA7A /* RidesViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RidesViewController.xib; sourceTree = ""; }; 9BA7A827B91FEFCA386D1C4A /* Pods-KarhooUISDK.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-KarhooUISDK.debug.xcconfig"; path = "Target Support Files/Pods-KarhooUISDK/Pods-KarhooUISDK.debug.xcconfig"; sourceTree = ""; }; 9FF975DAE636DFA8CA47C6F2 /* Pods_Client.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Client.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A1A0312526171A4E00B01E1F /* KarhooQuoteListPresenterSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KarhooQuoteListPresenterSpec.swift; sourceTree = ""; }; A9F928AAF8C70E5FFDE416BC /* Pods_KarhooUISDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_KarhooUISDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; AA979AB3B77F9708C97C2E84 /* Pods_KarhooUISDKTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_KarhooUISDKTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AE4AC8A325F12C28000F9E57 /* AdyenThreeDSecureUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdyenThreeDSecureUtils.swift; sourceTree = ""; }; D58D9119291DD6B42DC25E25 /* Pods-Client.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Client.debug.xcconfig"; path = "Target Support Files/Pods-Client/Pods-Client.debug.xcconfig"; sourceTree = ""; }; + D8263F4D262096C30042F259 /* TimeFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeFormatter.swift; sourceTree = ""; }; + D88BC2852620C51C00F1EA60 /* TimeFormatterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimeFormatterSpec.swift; sourceTree = ""; }; + D8D8ED2C261F1FDA0061066D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = ""; }; + D8D8ED31261F1FE00061066D /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = fr; path = fr.lproj/Localizable.stringsdict; sourceTree = ""; }; + D8D8ED32261F1FE10061066D /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = es; path = es.lproj/Localizable.stringsdict; sourceTree = ""; }; FC046594221484E2004E76FE /* RideDetailsScreenBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RideDetailsScreenBuilder.swift; sourceTree = ""; }; FC04659722148912004E76FE /* PopupDialogPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PopupDialogPresenterSpec.swift; sourceTree = ""; }; FC04659E2215A6AD004E76FE /* Navigation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Navigation.swift; sourceTree = ""; }; @@ -917,7 +930,6 @@ FC13584221D64E8C005054AE /* DefaultConstraintSwitcherTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultConstraintSwitcherTests.swift; sourceTree = ""; }; FC13584621D64F66005054AE /* KarhooBookingRequestPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooBookingRequestPresenterSpec.swift; sourceTree = ""; }; FC13584A21D6752F005054AE /* MockBookingRequestView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockBookingRequestView.swift; sourceTree = ""; }; - FC13584D21D6785C005054AE /* MockUserService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockUserService.swift; sourceTree = ""; }; FC13585121D67971005054AE /* MockTripService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockTripService.swift; sourceTree = ""; }; FC435EE52211B33B00FB6BB5 /* KarhooRidesPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooRidesPresenter.swift; sourceTree = ""; }; FC435EE72211B33B00FB6BB5 /* RidesMVP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RidesMVP.swift; sourceTree = ""; }; @@ -948,7 +960,6 @@ FC435F462211D34000FB6BB5 /* KarhooRidesPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooRidesPresenterSpec.swift; sourceTree = ""; }; FC435F472211D34000FB6BB5 /* RideCellStackButtonPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RideCellStackButtonPresenterSpec.swift; sourceTree = ""; }; FC435F482211D34000FB6BB5 /* KarhooTripMetaDataPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooTripMetaDataPresenterSpec.swift; sourceTree = ""; }; - FC435F492211D34000FB6BB5 /* KarhooRideDetailsPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooRideDetailsPresenterSpec.swift; sourceTree = ""; }; FC435F4A2211D34000FB6BB5 /* KarhooRidesListPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KarhooRidesListPresenterSpec.swift; sourceTree = ""; }; FC435F4B2211D34100FB6BB5 /* RideDetailsStackButtonPresenterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RideDetailsStackButtonPresenterSpec.swift; sourceTree = ""; }; FC435F542211D38E00FB6BB5 /* MockRidesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockRidesView.swift; sourceTree = ""; }; @@ -1124,6 +1135,7 @@ isa = PBXGroup; children = ( 090F08E821C94BB6000C7E50 /* Localizable.strings */, + D8D8ED2D261F1FDA0061066D /* Localizable.stringsdict */, ); path = Translations; sourceTree = ""; @@ -1197,6 +1209,7 @@ 092F281622B25B0700AF8E0E /* ThreeDSecure */ = { isa = PBXGroup; children = ( + AE4AC8A325F12C28000F9E57 /* AdyenThreeDSecureUtils.swift */, 092F281722B25B0700AF8E0E /* ThreeDSecureProvider.swift */, 092F281822B25B0700AF8E0E /* BraintreeThreeDSecureProvider.swift */, ); @@ -1238,11 +1251,11 @@ FC435F6F2211D7AF00FB6BB5 /* MockStackButtonView.swift */, 09022B232239133700C4A7EE /* MockViewController.swift */, 09F12DC622313E300024D6E9 /* MockBaseViewController.swift */, - 0949545221FF6FC800D930C0 /* MockAddressBarView.swift */, 0949545D2201C3E900D930C0 /* MockUserLocationProvider.swift */, 0949545421FF7CDB00D930C0 /* MockKarhooMapView.swift */, 094954562201C13E00D930C0 /* MockPhoneNumberCaller.swift */, 0949545B2201C2BA00D930C0 /* MockDataFormatterType.swift */, + 14A5B99B25C1BB3500986616 /* MockAddressBarView.swift */, ); path = Common; sourceTree = ""; @@ -1398,8 +1411,8 @@ FC435F692211D67200FB6BB5 /* MockCancelRideBehaviour.swift */, 097050A421FF0AF300E53AD2 /* MockBookingStatus.swift */, 09BDD18721C2C20A0074421C /* MockUserDefaults.swift */, - 0968F10421BE859400745370 /* MockAlertHandler.swift */, 09AAEF9721C4283200A04EEC /* MockValidator.swift */, + 14A5B97225C1AC7C00986616 /* MockAlertHandler.swift */, ); path = Classes; sourceTree = ""; @@ -1791,7 +1804,7 @@ 09DCC7EF21BE7CE000DF02B9 /* AddressSearchBar */ = { isa = PBXGroup; children = ( - 09DCC7F021BE7CE000DF02B9 /* KarhooAddressSearchBarPresenterSpec.swift */, + 14A5B95F25C1982200986616 /* KarhooAddressSearchBarPresenterSpec.swift */, ); path = AddressSearchBar; sourceTree = ""; @@ -1834,12 +1847,12 @@ 09E35D4721E5117C003E840C /* BookingScreen */ = { isa = PBXGroup; children = ( + 145EC6F125C98CBB00F1FC94 /* Domain */, 0949543E21FF5A8800D930C0 /* MockBookingView.swift */, 09E35D4821E5117C003E840C /* TripAllocation */, 09E35D4B21E5117C003E840C /* QuoteList */, 09E35D4D21E5117C003E840C /* QuoteCategoryBar */, 09E35D5121E5117C003E840C /* Map */, - 09E35D5321E5117C003E840C /* Domain */, 09E35D5521E5117C003E840C /* QuoteSortView */, ); path = BookingScreen; @@ -1849,7 +1862,7 @@ isa = PBXGroup; children = ( 09E35D4921E5117C003E840C /* MockBookingAllocationSpinnerView.swift */, - 09E35D4A21E5117C003E840C /* MockTripAllocationView.swift */, + 14A5B95625C1941C00986616 /* MockTripAllocationView.swift */, ); path = TripAllocation; sourceTree = ""; @@ -1880,14 +1893,6 @@ path = Map; sourceTree = ""; }; - 09E35D5321E5117C003E840C /* Domain */ = { - isa = PBXGroup; - children = ( - 09E35D5421E5117C003E840C /* MockQuoteSorter.swift */, - ); - path = Domain; - sourceTree = ""; - }; 09E35D5521E5117C003E840C /* QuoteSortView */ = { isa = PBXGroup; children = ( @@ -1923,7 +1928,7 @@ 09E35D6421E5118A003E840C /* QuoteList */ = { isa = PBXGroup; children = ( - 09E35D6521E5118A003E840C /* KarhooQuoteListPresenterSpec.swift */, + A1A0312526171A4E00B01E1F /* KarhooQuoteListPresenterSpec.swift */, ); path = QuoteList; sourceTree = ""; @@ -1974,11 +1979,19 @@ 09E683272379734F00BFF5B9 /* AddressMapView */ = { isa = PBXGroup; children = ( - 09E683282379735B00BFF5B9 /* MockAddressMapView.swift */, + 14A5B9AE25C1C61000986616 /* MockAddressMapView.swift */, ); path = AddressMapView; sourceTree = ""; }; + 145EC6F125C98CBB00F1FC94 /* Domain */ = { + isa = PBXGroup; + children = ( + 145EC6F225C98CC800F1FC94 /* MockQuoteSorter.swift */, + ); + path = Domain; + sourceTree = ""; + }; 4038DF3B2444C6C30014539B /* KarhooTextInputView */ = { isa = PBXGroup; children = ( @@ -2089,6 +2102,7 @@ 4017C46923CCB0230081834B /* EmptyStateView.swift */, 4010B0E1245C67F300E7B0F1 /* ErrorBannerView.swift */, 4038DF3B2444C6C30014539B /* KarhooTextInputView */, + D8263F4D262096C30042F259 /* TimeFormatter.swift */, ); path = Common; sourceTree = ""; @@ -2355,7 +2369,6 @@ children = ( 5C1CD0A1241A5D88004AFF7D /* TripOptionsViewModel.swift */, 5C1CD0A2241A5D88004AFF7D /* Presenter */, - 5C1CD0A5241A5D88004AFF7D /* TripActionsView.swift */, ); path = TripActionsView; sourceTree = ""; @@ -2390,13 +2403,14 @@ 5C2E260E2420F8AC00B1FF0C /* Client */ = { isa = PBXGroup; children = ( - 5CBE369424EAB99400C7B204 /* Keys.swift */, 5C2E260F2420F8AC00B1FF0C /* AppDelegate.swift */, 5C2E26112420F8AC00B1FF0C /* SceneDelegate.swift */, 5C2E26132420F8AC00B1FF0C /* ViewController.swift */, 5C2E26182420F8AD00B1FF0C /* Assets.xcassets */, 5C2E261A2420F8AD00B1FF0C /* LaunchScreen.storyboard */, 5C2E261D2420F8AD00B1FF0C /* Info.plist */, + 14A5B93225C1823C00986616 /* KarhooConfig.swift */, + 1413303125DBDC3100EDAD3B /* Keys.swift */, ); path = Client; sourceTree = ""; @@ -2532,7 +2546,6 @@ 094B763F22CE729400326CE1 /* BraintreeThreeDSecureProviderSpec.swift */, 095D7457231827B4002253C0 /* KarhooTripRatingCacheSpec.swift */, 094B763D22CE729300326CE1 /* BraintreePaymentNonceProviderSpec.swift */, - 09D293C522C651C10051C455 /* CurrencyCodeConverterSpec.swift */, 09D293C422C651C10051C455 /* KarhooDateFormatterSpec.swift */, 09D293C322C651C10051C455 /* QtaStringFormatterSpec.swift */, 09B30F5A224CE8BF007768CF /* CancelRideBehaviourSpec.swift */, @@ -2544,6 +2557,8 @@ FC13583B21D64D52005054AE /* TripInfoUtilitySpec.swift */, FC435F762211DC3B00FB6BB5 /* ViewModel */, FC13584021D64E63005054AE /* ConstraintSwitcher */, + 14A5B96A25C19BEE00986616 /* CurrencyCodeConverterSpec.swift */, + D88BC2852620C51C00F1EA60 /* TimeFormatterSpec.swift */, ); path = Common; sourceTree = ""; @@ -2581,9 +2596,9 @@ 407EC7EF22CF93DC00F24CFC /* MockAnalyticsService.swift */, FC658F612216D9C1006C48F2 /* MockPaymentService.swift */, FC13585121D67971005054AE /* MockTripService.swift */, - FC13584D21D6785C005054AE /* MockUserService.swift */, FC83E300221EF042008FE26D /* MockDriverTrackingService.swift */, 408AB682234F418B00B351B2 /* MockFareService.swift */, + 14A5B97A25C1AD4600986616 /* MockUserService.swift */, ); path = Service; sourceTree = ""; @@ -2697,12 +2712,12 @@ FC435F452211D30700FB6BB5 /* Rides */ = { isa = PBXGroup; children = ( - FC435F492211D34000FB6BB5 /* KarhooRideDetailsPresenterSpec.swift */, FC435F4A2211D34000FB6BB5 /* KarhooRidesListPresenterSpec.swift */, FC435F462211D34000FB6BB5 /* KarhooRidesPresenterSpec.swift */, FC435F482211D34000FB6BB5 /* KarhooTripMetaDataPresenterSpec.swift */, FC435F472211D34000FB6BB5 /* RideCellStackButtonPresenterSpec.swift */, FC435F4B2211D34100FB6BB5 /* RideDetailsStackButtonPresenterSpec.swift */, + 14A5B9C625C1CFCB00986616 /* KarhooRideDetailsPresenterSpec.swift */, ); path = Rides; sourceTree = ""; @@ -2786,7 +2801,7 @@ isa = PBXGroup; children = ( FC658F532216D307006C48F2 /* KarhooCardRegistrationFlowSpec.swift */, - 5C089DF92507C9F000B3D4CA /* AdyenCardRegistrationFlowSpec.swift */, + 14A5B98725C1B3A300986616 /* AdyenCardRegistrationFlowSpec.swift */, ); path = Routing; sourceTree = ""; @@ -3193,7 +3208,7 @@ FC8F471021539E24007841FB /* Frameworks */, FC8F471121539E24007841FB /* Headers */, FC8F471221539E24007841FB /* Resources */, - 5C8316B92469FCB200BAA926 /* ShellScript */, + 5C8316B92469FCB200BAA926 /* SwiftLint Script */, ); buildRules = ( ); @@ -3217,7 +3232,7 @@ buildRules = ( ); dependencies = ( - 5C2E26222420F8B500B1FF0C /* PBXTargetDependency */, + 14707ADE25D54B5B00CAD083 /* PBXTargetDependency */, ); name = KarhooUISDKTests; productName = KarhooUISDKTests; @@ -3230,7 +3245,7 @@ FC8F470B21539E24007841FB /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1130; + LastSwiftUpdateCheck = 1220; LastUpgradeCheck = 1100; ORGANIZATIONNAME = "Flit Technologies Ltd"; TargetAttributes = { @@ -3276,6 +3291,7 @@ files = ( 5C2E261C2420F8AD00B1FF0C /* LaunchScreen.storyboard in Resources */, 5C2E26192420F8AD00B1FF0C /* Assets.xcassets in Resources */, + D8D8ED2B261F1FDA0061066D /* Localizable.stringsdict in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3296,6 +3312,7 @@ 094AE85F21C9145D0046EC3C /* DatePickerViewController.xib in Resources */, FC83E2A6221ECC52008FE26D /* TripSummaryHeaderView.xib in Resources */, 092005E0225B91C1001038ED /* SideMenuViewController.xib in Resources */, + D8D8ED2A261F1FDA0061066D /* Localizable.stringsdict in Resources */, 407EC7DC22CF564E00F24CFC /* PinView.xib in Resources */, FC83E2A5221ECC48008FE26D /* TripSummaryViewController.xib in Resources */, 407EC7C522CF564E00F24CFC /* FormButton.xib in Resources */, @@ -3360,7 +3377,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 5C8316B92469FCB200BAA926 /* ShellScript */ = { + 5C8316B92469FCB200BAA926 /* SwiftLint Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -3369,13 +3386,14 @@ ); inputPaths = ( ); + name = "SwiftLint Script"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n\"${PODS_ROOT}/SwiftLint/swiftlint\"\n\n"; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n\"${PODS_ROOT}/SwiftLint/swiftlint\"\n"; }; 7DB439AD72189E18EBA41011 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -3441,9 +3459,10 @@ buildActionMask = 2147483647; files = ( 5C2E26142420F8AC00B1FF0C /* ViewController.swift in Sources */, - 5CBE369524EAB99500C7B204 /* Keys.swift in Sources */, 5C2E26102420F8AC00B1FF0C /* AppDelegate.swift in Sources */, 5C2E26122420F8AC00B1FF0C /* SceneDelegate.swift in Sources */, + 14A5B93325C1823C00986616 /* KarhooConfig.swift in Sources */, + 1413303225DBDC3100EDAD3B /* Keys.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3619,7 +3638,6 @@ 0946CB5D21CBDF0400DBDD42 /* BookingRequestScreenBuilder.swift in Sources */, FC435F3D2211BA1700FB6BB5 /* KarhooTripsProvider.swift in Sources */, 407EC7D022CF564E00F24CFC /* AddressBarMVP.swift in Sources */, - 5C1CD0B3241A5D88004AFF7D /* TripActionsView.swift in Sources */, 09BDD19121C2CAD00074421C /* FlightDetailsMVP.swift in Sources */, 091EA9D421AC4AA700849112 /* AccessibilityIdentifier.swift in Sources */, 09C7659F21DE688100CD81AB /* QuoteSortMVP.swift in Sources */, @@ -3665,6 +3683,7 @@ 09F60CE9226756AF00023C74 /* SideMenuHandler.swift in Sources */, 099106BD21B82D5200BD7E6F /* Address.swift in Sources */, 407EC7A122CF564E00F24CFC /* AlertHandler.swift in Sources */, + D8263F4E262096C30042F259 /* TimeFormatter.swift in Sources */, 407EC7CA22CF564E00F24CFC /* KarhooPrebookFieldView.swift in Sources */, 40E54AC42460DF9D00D13E10 /* KarhooAddCardView.swift in Sources */, 094AE85D21C9145D0046EC3C /* DatePickerMVP.swift in Sources */, @@ -3712,6 +3731,7 @@ 09C765C321DE688100CD81AB /* TripAllocationMVP.swift in Sources */, 5C7B185225310E170001CFE6 /* TouchAreaEdgeInsets.swift in Sources */, FC705B1E221322550001036E /* PopupDialogViewController.swift in Sources */, + AE4AC8A425F12C28000F9E57 /* AdyenThreeDSecureUtils.swift in Sources */, 09C765BE21DE688100CD81AB /* KarhooTripAllocationPresenter.swift in Sources */, 404E9C4B23C8BB2B00289F43 /* LineView.swift in Sources */, 092F281D22B25B0700AF8E0E /* BraintreeThreeDSecureProvider.swift in Sources */, @@ -3769,183 +3789,184 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 09022B242239133700C4A7EE /* MockViewController.swift in Sources */, - 09E35D5821E5117C003E840C /* MockTripAllocationView.swift in Sources */, - 09DCC7F421BE7CE000DF02B9 /* KarhooAddressSearchBarPresenterSpec.swift in Sources */, - 09D293C822C651C20051C455 /* CurrencyCodeConverterSpec.swift in Sources */, - 0968F10521BE859400745370 /* MockAlertHandler.swift in Sources */, - 09E35D5D21E5117C003E840C /* MockQuoteSorter.swift in Sources */, - 5C089DFA2507C9F000B3D4CA /* AdyenCardRegistrationFlowSpec.swift in Sources */, - 0949545321FF6FC800D930C0 /* MockAddressBarView.swift in Sources */, - 09E683292379735B00BFF5B9 /* MockAddressMapView.swift in Sources */, - FC435F4F2211D34100FB6BB5 /* KarhooRideDetailsPresenterSpec.swift in Sources */, - 0949545A2201C1ED00D930C0 /* CLLocationCoordinate2D+Equatable.swift in Sources */, - 096192F621BEAB9C0052B71C /* UnitTestSetup.swift in Sources */, - FC435F602211D3D700FB6BB5 /* MockRideDetailsView.swift in Sources */, - 09E35D7021E5118A003E840C /* KarhooBookingPresenterSpec.swift in Sources */, - FC658F4C2216D0BB006C48F2 /* MockBookingRequestScreenBuilder.swift in Sources */, - 097050A521FF0AF300E53AD2 /* MockBookingStatus.swift in Sources */, - FC13583C21D64D52005054AE /* TripInfoUtilitySpec.swift in Sources */, - 0966BDBA225CF8A90032C76C /* KarhooBookingViewController+BuilderSpec.swift in Sources */, - 090F08E421C93591000C7E50 /* DatePickerPresenterSpec.swift in Sources */, - FC13584B21D6752F005054AE /* MockBookingRequestView.swift in Sources */, - FCAD1C0E220884CC00C3AD1D /* MockPrebookConfirmationView.swift in Sources */, - FC435F702211D7AF00FB6BB5 /* MockStackButtonView.swift in Sources */, - 094B764222CE729400326CE1 /* BraintreeThreeDSecureProviderSpec.swift in Sources */, - 5C8316BF246AE84900BAA926 /* EmptyBookingMapStrategySpec.swift in Sources */, - FC435F6E2211D76100FB6BB5 /* MockTripsProvider.swift in Sources */, - 0968F0EA21BE7FF100745370 /* MockAddressView.swift in Sources */, - FC13584E21D6785C005054AE /* MockUserService.swift in Sources */, - FC435F882211E2C100FB6BB5 /* BookingStatusViewModelSpec.swift in Sources */, - FC83E2DE221EECB0008FE26D /* TripAddressBarPresenterSpec.swift in Sources */, - 09E35D5E21E5117C003E840C /* MockQuoteSortView.swift in Sources */, - 09E1475521C7ED06003BB30B /* MockFlightDetailsView.swift in Sources */, - 09D293C622C651C20051C455 /* QtaStringFormatterSpec.swift in Sources */, - 094954572201C13E00D930C0 /* MockPhoneNumberCaller.swift in Sources */, - 09E35D7821E5118A003E840C /* BookingAddressBarPresenterSpec.swift in Sources */, - 092F282322B2607D00AF8E0E /* PrimitiveUtil.swift in Sources */, - 09ED7B1C21C2A7E000CF6D73 /* KarhooRecentAddressProviderSpec.swift in Sources */, - FC13583F21D64E18005054AE /* BookingDetailsSpec.swift in Sources */, - 0966BDBC225DFFE60032C76C /* TripExtSpec.swift in Sources */, - FC83E2F4221EEDF6008FE26D /* MockTripView.swift in Sources */, - FC658F492216D0BB006C48F2 /* MockFlightDetailsScreenBuilder.swift in Sources */, - 09E68326237972C000BFF5B9 /* KarhooAddressMapPresenterSpec.swift in Sources */, - 0968F10021BE850F00745370 /* MockPollCall.swift in Sources */, - FC435F4E2211D34100FB6BB5 /* KarhooTripMetaDataPresenterSpec.swift in Sources */, - FC83E2FB221EEE82008FE26D /* MockDestinationEtaView.swift in Sources */, - FC435F8A2211E30400FB6BB5 /* TripDetailsViewModelSpec.swift in Sources */, - 09C169BA22819BBF00CF7E66 /* MockBookingMapStrategy.swift in Sources */, - 0968F0FD21BE850F00745370 /* MockCall.swift in Sources */, - 092F282122B25C7800AF8E0E /* MockPaymentNonceProvider.swift in Sources */, - FC83E2EB221EED94008FE26D /* KarhooTripSummaryPresenterSpec.swift in Sources */, - 09E35D7621E5118A003E840C /* DestinationSetStrategySpec.swift in Sources */, - FC435F862211E26400FB6BB5 /* KarhooTripsProviderSpec.swift in Sources */, - 09AAEF9821C4283200A04EEC /* MockValidator.swift in Sources */, - 0949544B21FF5F0900D930C0 /* MockQuoteService.swift in Sources */, - 09C169C02281B7C700CF7E66 /* BaseViewControllerSpec.swift in Sources */, - FC658F482216D0BB006C48F2 /* MockDatePickerScreenBuilder.swift in Sources */, - 0968F0FF21BE850F00745370 /* MockKarhooExecutable.swift in Sources */, - FC658F5D2216D5AE006C48F2 /* MockCardRegistrationFlow.swift in Sources */, - 40D741AD22C676C20003B09B /* KarhooPaymentPresenterSpec.swift in Sources */, - 093D2E6E2224346C00D5F031 /* PopupDialogView.swift in Sources */, - 0968D82822F8649900047FCF /* MockTripFeedbackView.swift in Sources */, - 09D8B29622F444AA00569C55 /* MockFeedbackScreenBuilder.swift in Sources */, - 09E35D5921E5117C003E840C /* MockQuoteListView.swift in Sources */, - FC83E301221EF042008FE26D /* MockDriverTrackingService.swift in Sources */, - 5C3C671124603B5700C736E9 /* MockURLOpener.swift in Sources */, - 095D7456231825C7002253C0 /* MockTripRatingCache.swift in Sources */, - FC435F672211D3DD00FB6BB5 /* MockRidesListView.swift in Sources */, - FC83E2E9221EED8F008FE26D /* TripSummaryInfoViewModelSpec.swift in Sources */, - FC435F5F2211D3D700FB6BB5 /* MockTripMetaDataView.swift in Sources */, - 0949543F21FF5A8800D930C0 /* MockBookingView.swift in Sources */, - FC435F512211D34100FB6BB5 /* RideDetailsStackButtonPresenterSpec.swift in Sources */, - FC435F632211D3D700FB6BB5 /* MockTripMetaDataActions.swift in Sources */, - 0968F0EC21BE7FF100745370 /* MockAddressSearchProviderDelegate.swift in Sources */, - 09F86F86222D8553008C86DE /* MockBookingDetailsObserver.swift in Sources */, - 5C9D991A242CED15004F1DBD /* MockAddressService.swift in Sources */, - FC83E2D8221EEC9E008FE26D /* KarhooTripDetailsPresenterSpec.swift in Sources */, - 4038DF44244617960014539B /* KarhooGuestBookingRequestPresenterSpec.swift in Sources */, - FCAD1C0322087CA700C3AD1D /* PrebookConfirmationFormatterSpec.swift in Sources */, - 097800A4226F1FE6008772E4 /* MockSideMenuHandler.swift in Sources */, - 09ED7B1E21C2A81200CF6D73 /* MockRecentAddressProvider.swift in Sources */, - 408AB683234F418B00B351B2 /* MockFareService.swift in Sources */, - 0968F0ED21BE7FF100745370 /* MockAddressSearchProvider.swift in Sources */, - FC435F612211D3D700FB6BB5 /* MockRideDetailsStackButtonActions.swift in Sources */, - FC435F4C2211D34100FB6BB5 /* KarhooRidesPresenterSpec.swift in Sources */, - 09E35D5721E5117C003E840C /* MockBookingAllocationSpinnerView.swift in Sources */, - 095D7458231827B4002253C0 /* KarhooTripRatingCacheSpec.swift in Sources */, - FC83E2FF221EEE94008FE26D /* MockOriginEtaView.swift in Sources */, - FC435F8E2211E3FB00FB6BB5 /* MockTimeScheduler.swift in Sources */, - FC83E2D7221EEC9E008FE26D /* TripScreenDetailsViewModelSpec.swift in Sources */, - 40A2852122B253870020D78F /* QuoteCellViewModelSpec.swift in Sources */, - 094B764422CE731200326CE1 /* TripStatesGetterSpec.swift in Sources */, - 09B30F5D224CE8BF007768CF /* TripsListSorterSpec.swift in Sources */, - FC83E30B221F1839008FE26D /* MockTripScreenBuilder.swift in Sources */, - 0949545C2201C2BA00D930C0 /* MockDataFormatterType.swift in Sources */, - 0949545E2201C3E900D930C0 /* MockUserLocationProvider.swift in Sources */, - FC658F572216D4FC006C48F2 /* MockNavigationItem.swift in Sources */, - 0968F10721BE885100745370 /* MockError.swift in Sources */, - 09E35D7421E5118A003E840C /* KarhooQuoteCategoryBarPresenterSpec.swift in Sources */, - 09B30F5C224CE8BF007768CF /* CancelRideBehaviourSpec.swift in Sources */, - FC435F502211D34100FB6BB5 /* KarhooRidesListPresenterSpec.swift in Sources */, - 09E35D7121E5118A003E840C /* BookingAllocationSpinnerPresenterSpec.swift in Sources */, - FC435F6A2211D67200FB6BB5 /* MockCancelRideBehaviour.swift in Sources */, - FC13585221D67971005054AE /* MockTripService.swift in Sources */, - 0968F0EF21BE816F00745370 /* TestUtil.swift in Sources */, - 09DCC7F521BE7CE000DF02B9 /* KarhooAddressPresenterSpec.swift in Sources */, - FCAD1C0422087CA700C3AD1D /* PrebookConfirmationViewModelSpec.swift in Sources */, - 09BDD19821C2CBD00074421C /* FlightDetailsPresenterSpec.swift in Sources */, - FC83E2EF221EEDDE008FE26D /* MockTripSummaryInfoView.swift in Sources */, - FC435F642211D3D700FB6BB5 /* MockRideCellStackButtonActions.swift in Sources */, - FC83E2F5221EEDF6008FE26D /* MockMapViewActions.swift in Sources */, - 090F08E121C934EB000C7E50 /* MockTimeSinceNowProvider.swift in Sources */, - FC435F722211D7F500FB6BB5 /* MockFeedbackMailComposter.swift in Sources */, - 094B764022CE729400326CE1 /* BraintreePaymentNonceProviderSpec.swift in Sources */, + 14707C8225D54C2100CAD083 /* MockViewController.swift in Sources */, + 14707C4525D54C2100CAD083 /* MockLocationService.swift in Sources */, + 14707C7925D54C2100CAD083 /* MockTripsSorter.swift in Sources */, + 14707C8D25D54C2200CAD083 /* MockOriginEtaView.swift in Sources */, + 14707CDC25D54C2200CAD083 /* MockPopupDialogScreenBuilder.swift in Sources */, + 14707C9E25D54C2200CAD083 /* MockTimeSinceNowProvider.swift in Sources */, + 14707C7525D54C2100CAD083 /* KarhooTripSummaryPresenterSpec.swift in Sources */, + 14707CB225D54C2200CAD083 /* KarhooBookingPresenterSpec.swift in Sources */, + 14707C5D25D54C2100CAD083 /* DatePickerPresenterSpec.swift in Sources */, + 14707C6325D54C2100CAD083 /* MockBookingRequestView.swift in Sources */, + 14707C8A25D54C2200CAD083 /* MockKarhooMapView.swift in Sources */, + 14707C8925D54C2200CAD083 /* MockDestinationEtaView.swift in Sources */, + 14707C4F25D54C2100CAD083 /* MockPrebookConfirmationScreenBuilder.swift in Sources */, + 14707CD625D54C2200CAD083 /* BraintreePaymentNonceProviderSpec.swift in Sources */, + 14707C9025D54C2200CAD083 /* KarhooBookingViewController+BuilderSpec.swift in Sources */, + 14707CB025D54C2200CAD083 /* KarhooPaymentPresenterSpec.swift in Sources */, + 14707CC725D54C2200CAD083 /* KarhooTripAllocationPresenterSpec.swift in Sources */, + 14707C7625D54C2100CAD083 /* MockUserDefaults.swift in Sources */, + 14707CC825D54C2200CAD083 /* MockError.swift in Sources */, + 14707C7C25D54C2100CAD083 /* KarhooBookingRequestPresenterSpec.swift in Sources */, + 14707CAD25D54C2200CAD083 /* MockRidesListView.swift in Sources */, + 14707C3C25D54C2100CAD083 /* BookingAllocationSpinnerPresenterSpec.swift in Sources */, + 14707C6A25D54C2100CAD083 /* MockBookingRequestScreenBuilder.swift in Sources */, + 14707CD725D54C2200CAD083 /* MockSideMenuHandler.swift in Sources */, + 14707C7F25D54C2100CAD083 /* BookingMapPresenterSpec.swift in Sources */, + 14707C8E25D54C2200CAD083 /* BaseViewControllerSpec.swift in Sources */, + 14707C9725D54C2200CAD083 /* MockThreeDSecureProvider.swift in Sources */, + 14707C9225D54C2200CAD083 /* KarhooAddressSearchBarPresenterSpec.swift in Sources */, + 14707CDB25D54C2200CAD083 /* KarhooRidesListPresenterSpec.swift in Sources */, + 14707C7025D54C2100CAD083 /* MockRidesListActions.swift in Sources */, + 14707CD025D54C2200CAD083 /* MockQuoteListView.swift in Sources */, + 14707C9C25D54C2200CAD083 /* MockQuoteService.swift in Sources */, + 14707C5425D54C2100CAD083 /* MockKarhooExecutable.swift in Sources */, + 14707CB825D54C2200CAD083 /* MockAddressView.swift in Sources */, + 14707CA525D54C2200CAD083 /* TripSummaryInfoViewModelSpec.swift in Sources */, + 14707CA825D54C2200CAD083 /* MockRideDetailsView.swift in Sources */, + 14707C5A25D54C2100CAD083 /* TripStatesGetterSpec.swift in Sources */, + 14707C9925D54C2200CAD083 /* MockFeedbackScreenBuilder.swift in Sources */, + 14707C4925D54C2100CAD083 /* MockTripScreenDetailsView.swift in Sources */, + 14707C6D25D54C2100CAD083 /* TripMapPresenterSpec.swift in Sources */, + 14707CAA25D54C2200CAD083 /* MockTripFeedbackView.swift in Sources */, + 14707C7D25D54C2100CAD083 /* MockQuoteSortView.swift in Sources */, + 14707CC325D54C2200CAD083 /* MockQuoteCategoryBarView.swift in Sources */, + 14707CB125D54C2200CAD083 /* TripMetaDataViewModelSpec.swift in Sources */, + 14707C7725D54C2100CAD083 /* BookingDetailsSpec.swift in Sources */, + 14707C6225D54C2100CAD083 /* KarhooPrebookConfirmationPresenterSpec.swift in Sources */, + 14707CCD25D54C2200CAD083 /* MockTripView.swift in Sources */, + 14707CBC25D54C2200CAD083 /* MockFlightDetailsScreenBuilder.swift in Sources */, + 14707C9F25D54C2200CAD083 /* MockRecentAddressProvider.swift in Sources */, + 14707C9825D54C2200CAD083 /* MockTripAllocationView.swift in Sources */, + 14707C4B25D54C2100CAD083 /* PopupDialogView.swift in Sources */, + 14707CD225D54C2200CAD083 /* MockQuoteSorter.swift in Sources */, + 14707CC125D54C2200CAD083 /* KarhooGuestBookingRequestPresenterSpec.swift in Sources */, + 14707C5625D54C2100CAD083 /* MockTimeScheduler.swift in Sources */, + 14707C6025D54C2100CAD083 /* BookingAddressBarPresenterSpec.swift in Sources */, + 14707CC925D54C2200CAD083 /* MockTripSummaryView.swift in Sources */, + 14707C5E25D54C2100CAD083 /* MockUserLocationProvider.swift in Sources */, + 14707CAB25D54C2200CAD083 /* KarhooCardRegistrationFlowSpec.swift in Sources */, + 14707C6B25D54C2100CAD083 /* MockTripService.swift in Sources */, + 14707C8025D54C2100CAD083 /* KarhooQuoteSorterSpec.swift in Sources */, + 14707C8625D54C2200CAD083 /* MockPaymentScreenBuilder.swift in Sources */, + 14707C8525D54C2200CAD083 /* KarhooRideDetailsPresenterSpec.swift in Sources */, + 14707C8C25D54C2200CAD083 /* KarhooQuoteCategoryBarPresenterSpec.swift in Sources */, + 14707CD525D54C2200CAD083 /* MockKarhooPollExecutor.swift in Sources */, + 14707C4125D54C2100CAD083 /* KarhooRecentAddressProviderSpec.swift in Sources */, + 14707CD325D54C2200CAD083 /* MockBookingAllocationSpinnerView.swift in Sources */, + 14707C4025D54C2100CAD083 /* TripExtSpec.swift in Sources */, + 14707CB425D54C2200CAD083 /* MockRidesScreenBuilder.swift in Sources */, + 14707C9D25D54C2200CAD083 /* MockMapViewActions.swift in Sources */, + 14707C8F25D54C2200CAD083 /* RideDetailsStackButtonPresenterSpec.swift in Sources */, + 14707C5C25D54C2100CAD083 /* KarhooAddressSearchProviderSpec.swift in Sources */, + 14707CDF25D54C2200CAD083 /* MockTripSummaryScreenBuilder.swift in Sources */, + 14707CD825D54C2200CAD083 /* TestUtil.swift in Sources */, + 14707CB925D54C2200CAD083 /* MockPrebookConfirmationView.swift in Sources */, + 14707C8325D54C2200CAD083 /* MockCancelRideBehaviour.swift in Sources */, + 14707C7E25D54C2100CAD083 /* KarhooDateFormatterSpec.swift in Sources */, + 14707CCB25D54C2200CAD083 /* MockAppStateNotifier.swift in Sources */, + 14707C7125D54C2100CAD083 /* MockDataFormatterType.swift in Sources */, + 14707C3A25D54C2100CAD083 /* DestinationSetStrategySpec.swift in Sources */, + 14707CA025D54C2200CAD083 /* KarhooTripRatingCacheSpec.swift in Sources */, + 14707C6525D54C2100CAD083 /* MockFareService.swift in Sources */, + 14707C7A25D54C2100CAD083 /* MockAddressScreenBuilder.swift in Sources */, + 14707C9A25D54C2200CAD083 /* EmptyBookingMapStrategySpec.swift in Sources */, + 14707CAE25D54C2200CAD083 /* MockTimeFetcher.swift in Sources */, + 14707C6825D54C2100CAD083 /* MockCall.swift in Sources */, + 14707C4625D54C2100CAD083 /* MockValidator.swift in Sources */, + 14707C3E25D54C2100CAD083 /* MockNavigationItem.swift in Sources */, + 14707CDD25D54C2200CAD083 /* FlightDetailsPresenterSpec.swift in Sources */, + 14707C5925D54C2100CAD083 /* QuoteCellViewModelSpec.swift in Sources */, + 14707C4C25D54C2100CAD083 /* MockPollCall.swift in Sources */, + 14707C8125D54C2100CAD083 /* KarhooBookingStatusSpec.swift in Sources */, + 14707CBB25D54C2200CAD083 /* MockAddressSearchProviderDelegate.swift in Sources */, + 14707C4825D54C2100CAD083 /* KarhooTripDetailsPresenterSpec.swift in Sources */, + 14707C6625D54C2100CAD083 /* MockAddressService.swift in Sources */, + 14707CD425D54C2200CAD083 /* BraintreeThreeDSecureProviderSpec.swift in Sources */, + 14707CC425D54C2200CAD083 /* QtaStringFormatterSpec.swift in Sources */, + 14707C6925D54C2100CAD083 /* ResizingSwitcherTests.swift in Sources */, + 14707CBF25D54C2200CAD083 /* UnitTestSetup.swift in Sources */, + 14707C8725D54C2200CAD083 /* MockObservable.swift in Sources */, + 14707CA725D54C2200CAD083 /* CancelRideBehaviourSpec.swift in Sources */, + 14707CCA25D54C2200CAD083 /* MockURLOpener.swift in Sources */, + 14707CBD25D54C2200CAD083 /* PrebookConfirmationViewModelSpec.swift in Sources */, + 14707C4A25D54C2100CAD083 /* MockTripSummaryInfoView.swift in Sources */, + 14707C5525D54C2100CAD083 /* KarhooOriginEtaPresenterSpec.swift in Sources */, + 14707C4E25D54C2100CAD083 /* MockAddressBarView.swift in Sources */, + 14707C4725D54C2100CAD083 /* KarhooRidesPresenterSpec.swift in Sources */, + 14707C9525D54C2200CAD083 /* MockTripsProvider.swift in Sources */, + 14707C7225D54C2100CAD083 /* MockTripRatingCache.swift in Sources */, + 14707CD925D54C2200CAD083 /* MockPhoneNumberCaller.swift in Sources */, + 14707C6425D54C2100CAD083 /* MockTripScreenBuilder.swift in Sources */, + 14707C3F25D54C2100CAD083 /* MockAddressSearchProvider.swift in Sources */, + 14707C5225D54C2100CAD083 /* TripScreenDetailsViewModelSpec.swift in Sources */, + 14707CCE25D54C2200CAD083 /* TripsListSorterSpec.swift in Sources */, + 14707C3925D54C2100CAD083 /* MockRidesView.swift in Sources */, + 14707CDA25D54C2200CAD083 /* MockRideDetailsScreenBuilder.swift in Sources */, + 14707C6F25D54C2100CAD083 /* TripDetailsViewModelSpec.swift in Sources */, + 14707CCC25D54C2200CAD083 /* MockBookingStatus.swift in Sources */, + 14707CBA25D54C2200CAD083 /* TestBroadcaster.swift in Sources */, + 14707CDE25D54C2200CAD083 /* PrebookConfirmationFormatterSpec.swift in Sources */, + 14707C9325D54C2200CAD083 /* MockPickupOnlyStrategyDelegate.swift in Sources */, + 14707CA925D54C2200CAD083 /* MockTripMetaDataView.swift in Sources */, + 14707C5325D54C2100CAD083 /* MockPickupOnlyStrategy.swift in Sources */, + 14707CCF25D54C2200CAD083 /* KarhooDestinationEtaPresenterSpec.swift in Sources */, + 14707C9125D54C2200CAD083 /* PrimitiveUtil.swift in Sources */, + 14707CBE25D54C2200CAD083 /* MockBookingDetailsObserver.swift in Sources */, + 14707C6C25D54C2100CAD083 /* KarhooAddressPresenterSpec.swift in Sources */, + 14707C8825D54C2200CAD083 /* MockDriverTrackingService.swift in Sources */, + 14707C4D25D54C2100CAD083 /* MockBaseViewController.swift in Sources */, + 14707CA425D54C2200CAD083 /* MockKarhooPaymentView.swift in Sources */, + 14707C7425D54C2100CAD083 /* MockBookingMapStrategy.swift in Sources */, + 14707CB725D54C2200CAD083 /* TripFeedbackPresenterSpec.swift in Sources */, + 14707C3B25D54C2100CAD083 /* UINavigationSpec.swift in Sources */, + 14707CB525D54C2200CAD083 /* MockRideDetailsStackButtonActions.swift in Sources */, + 14707C4225D54C2100CAD083 /* MockCardRegistrationFlow.swift in Sources */, + 14707C5125D54C2100CAD083 /* KarhooTripPresenterSpec.swift in Sources */, + 14707C6125D54C2100CAD083 /* MockAddressMapView.swift in Sources */, + 14707CC225D54C2200CAD083 /* CurrencyCodeConverterSpec.swift in Sources */, + 14707CAC25D54C2200CAD083 /* KarhooAddressMapPresenterSpec.swift in Sources */, + 14707C9625D54C2200CAD083 /* CLLocationCoordinate2D+Equatable.swift in Sources */, + 14707CA125D54C2200CAD083 /* AdyenCardRegistrationFlowSpec.swift in Sources */, + 14707C3D25D54C2100CAD083 /* MockAnalytics.swift in Sources */, + 14707C7B25D54C2100CAD083 /* MockPaymentNonceProvider.swift in Sources */, + 14707CC525D54C2200CAD083 /* PopupDialogPresenterSpec.swift in Sources */, + D88BC2862620C51C00F1EA60 /* TimeFormatterSpec.swift in Sources */, + 14707C7825D54C2100CAD083 /* MockAlertHandler.swift in Sources */, + 14707C5725D54C2100CAD083 /* MockDatePickerScreenBuilder.swift in Sources */, + 14707C8B25D54C2200CAD083 /* MockRideCellStackButtonActions.swift in Sources */, FC435F7A2211DDB400FB6BB5 /* RideCellViewModelSpec.swift in Sources */, - 09E35D5C21E5117C003E840C /* MockPickupOnlyStrategyDelegate.swift in Sources */, - FC658F4B2216D0BB006C48F2 /* MockPrebookConfirmationScreenBuilder.swift in Sources */, - 09F86F81222D60AC008C86DE /* TestBroadcaster.swift in Sources */, - FC83E30D221F18F3008FE26D /* MockTripSummaryScreenBuilder.swift in Sources */, - 09AAEF9621C4270900A04EEC /* FlightNumberValidatorSpec.swift in Sources */, - FC4B92ED222E982400FE33B4 /* MockRideDetailsScreenBuilder.swift in Sources */, - FC83E2DB221EECA9008FE26D /* KarhooOriginEtaPresenterSpec.swift in Sources */, - FCAD1C0222087CA700C3AD1D /* KarhooPrebookConfirmationPresenterSpec.swift in Sources */, - 5C209770244475660097BA3A /* MockKarhooPaymentView.swift in Sources */, - 09BDD18821C2C20A0074421C /* MockUserDefaults.swift in Sources */, - FC658F622216D9C1006C48F2 /* MockPaymentService.swift in Sources */, - FC658F80221726C8006C48F2 /* UINavigationSpec.swift in Sources */, - 09F12DC92232ABD30024D6E9 /* MockPopupDialogScreenBuilder.swift in Sources */, - FC435F562211D38F00FB6BB5 /* MockRidesView.swift in Sources */, - 09E35D7321E5118A003E840C /* KarhooQuoteListPresenterSpec.swift in Sources */, - 0968D82522F82F8C00047FCF /* TripFeedbackPresenterSpec.swift in Sources */, - FC83E2F0221EEDDE008FE26D /* MockTripSummaryView.swift in Sources */, - FC83E2D3221EEC93008FE26D /* KarhooDestinationEtaPresenterSpec.swift in Sources */, - FC658F712216F8B7006C48F2 /* MockPaymentScreenBuilder.swift in Sources */, - FC435F4D2211D34100FB6BB5 /* RideCellStackButtonPresenterSpec.swift in Sources */, - 09F86F84222D84A8008C86DE /* MockAppStateNotifier.swift in Sources */, - 09F12DC722313E300024D6E9 /* MockBaseViewController.swift in Sources */, - 407EC7F022CF93DC00F24CFC /* MockAnalyticsService.swift in Sources */, - FCF7E68F2226A76B00EEBF98 /* KarhooBookingStatusSpec.swift in Sources */, - 090F08E021C934EB000C7E50 /* MockDatePickerView.swift in Sources */, - FC83E2DF221EECB0008FE26D /* TripMapPresenterSpec.swift in Sources */, - FC435F6D2211D76100FB6BB5 /* MockTripsSorter.swift in Sources */, - FC13584421D64E8C005054AE /* DefaultConstraintSwitcherTests.swift in Sources */, - 09E35D7221E5118A003E840C /* KarhooTripAllocationPresenterSpec.swift in Sources */, - FC13584721D64F66005054AE /* KarhooBookingRequestPresenterSpec.swift in Sources */, - 097800AA226F4886008772E4 /* MockLocationService.swift in Sources */, - FC658F552216D308006C48F2 /* KarhooCardRegistrationFlowSpec.swift in Sources */, - 09E35D7521E5118A003E840C /* BookingMapPresenterSpec.swift in Sources */, - 09E35D7921E5118A003E840C /* KarhooQuoteSorterSpec.swift in Sources */, - 0949545521FF7CDB00D930C0 /* MockKarhooMapView.swift in Sources */, - 09D293C722C651C20051C455 /* KarhooDateFormatterSpec.swift in Sources */, - FC83E303221EF0B9008FE26D /* MockTimeFetcher.swift in Sources */, - FC435F782211DC5600FB6BB5 /* TripMetaDataViewModelSpec.swift in Sources */, - FC04659822148912004E76FE /* PopupDialogPresenterSpec.swift in Sources */, - 09DCC7F621BE7CE000DF02B9 /* KarhooAddressSearchProviderSpec.swift in Sources */, - FC83E2FD221EEE8A008FE26D /* MockTripScreenDetailsView.swift in Sources */, - 0968F0EB21BE7FF100745370 /* MockAddressSearchBar.swift in Sources */, - FC658F4D2216D0BB006C48F2 /* MockAddressScreenBuilder.swift in Sources */, - FC83E2D9221EEC9E008FE26D /* KarhooTripPresenterSpec.swift in Sources */, - 5C4397D022615F37006BC6C4 /* MockRidesScreenBuilder.swift in Sources */, - FC13584321D64E8C005054AE /* ResizingSwitcherTests.swift in Sources */, - 094B764622CE734D00326CE1 /* MockThreeDSecureProvider.swift in Sources */, - 09E35D7721E5118A003E840C /* PickupOnlyStrategySpec.swift in Sources */, - FC435F682211D3DD00FB6BB5 /* MockRidesListActions.swift in Sources */, - 0968F10221BE850F00745370 /* MockObservable.swift in Sources */, - 09E35D5A21E5117C003E840C /* MockQuoteCategoryBarView.swift in Sources */, - 5C9D9918242CEBC4004F1DBD /* MockAnalytics.swift in Sources */, - 09C169BC22819C1A00CF7E66 /* MockPickupOnlyStrategy.swift in Sources */, - 0968F0FE21BE850F00745370 /* MockKarhooPollExecutor.swift in Sources */, + 14707CA325D54C2200CAD083 /* KarhooTripMetaDataPresenterSpec.swift in Sources */, + 14707CC625D54C2200CAD083 /* TripAddressBarPresenterSpec.swift in Sources */, + 14707C7325D54C2100CAD083 /* MockFlightDetailsView.swift in Sources */, + 14707C5825D54C2100CAD083 /* MockBookingView.swift in Sources */, + 14707C4325D54C2100CAD083 /* MockStackButtonView.swift in Sources */, + 14707CC025D54C2200CAD083 /* MockFeedbackMailComposter.swift in Sources */, + 14707CA625D54C2200CAD083 /* FlightNumberValidatorSpec.swift in Sources */, + 14707C9B25D54C2200CAD083 /* PickupOnlyStrategySpec.swift in Sources */, + 14707C5F25D54C2100CAD083 /* KarhooTripsProviderSpec.swift in Sources */, + A1A0312626171A4E00B01E1F /* KarhooQuoteListPresenterSpec.swift in Sources */, + 14707C8425D54C2200CAD083 /* MockDatePickerView.swift in Sources */, + 14707C6725D54C2100CAD083 /* MockPaymentService.swift in Sources */, + 14707C4425D54C2100CAD083 /* MockUserService.swift in Sources */, + 14707C5B25D54C2100CAD083 /* BookingStatusViewModelSpec.swift in Sources */, + 14707C6E25D54C2100CAD083 /* MockAddressSearchBar.swift in Sources */, + 14707CD125D54C2200CAD083 /* MockTripMetaDataActions.swift in Sources */, + 14707CB325D54C2200CAD083 /* MockAnalyticsService.swift in Sources */, + 14707C5025D54C2100CAD083 /* DefaultConstraintSwitcherTests.swift in Sources */, + 14707CAF25D54C2200CAD083 /* TripInfoUtilitySpec.swift in Sources */, + 14707C9425D54C2200CAD083 /* RideCellStackButtonPresenterSpec.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 5C2E26222420F8B500B1FF0C /* PBXTargetDependency */ = { + 14707ADE25D54B5B00CAD083 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 5C2E260C2420F8AC00B1FF0C /* Client */; - targetProxy = 5C2E26212420F8B500B1FF0C /* PBXContainerItemProxy */; + target = FC8F471321539E24007841FB /* KarhooUISDK */; + targetProxy = 14707ADD25D54B5B00CAD083 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -3968,6 +3989,16 @@ name = LaunchScreen.storyboard; sourceTree = ""; }; + D8D8ED2D261F1FDA0061066D /* Localizable.stringsdict */ = { + isa = PBXVariantGroup; + children = ( + D8D8ED2C261F1FDA0061066D /* en */, + D8D8ED31261F1FE00061066D /* fr */, + D8D8ED32261F1FE10061066D /* es */, + ); + name = Localizable.stringsdict; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -3977,6 +4008,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = U7U4Q7YGDH; ENABLE_BITCODE = NO; INFOPLIST_FILE = Client/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -3999,6 +4031,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = U7U4Q7YGDH; ENABLE_BITCODE = NO; INFOPLIST_FILE = Client/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; @@ -4153,7 +4186,7 @@ CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 4; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = U7U4Q7YGDH; DYLIB_COMPATIBILITY_VERSION = 1; @@ -4172,7 +4205,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.4.0; + MARKETING_VERSION = 1.5.0; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.karhoo.KarhooUISDK; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; @@ -4195,7 +4228,7 @@ CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 4; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = U7U4Q7YGDH; DYLIB_COMPATIBILITY_VERSION = 1; @@ -4214,7 +4247,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.4.0; + MARKETING_VERSION = 1.5.0; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.karhoo.KarhooUISDK; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; @@ -4230,10 +4263,11 @@ isa = XCBuildConfiguration; baseConfigurationReference = 2372675E70509D3779F8061D /* Pods-KarhooUISDKTests.debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(EMBEDDED_CONTENT_CONTAINS_SWIFT)"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; BUILD_LIBRARY_FOR_DISTRIBUTION = NO; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = U7U4Q7YGDH; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = "$(inherited)"; ENABLE_TESTING_SEARCH_PATHS = YES; EXCLUDED_ARCHS = "x86_64-apple-ios-simulator"; INFOPLIST_FILE = KarhooUISDKTests/Info.plist; diff --git a/KarhooUISDK.xcodeproj/xcshareddata/xcschemes/KarhooUISDKTests.xcscheme b/KarhooUISDK.xcodeproj/xcshareddata/xcschemes/KarhooUISDKTests.xcscheme index 06cde22a7..f12c3e1c2 100644 --- a/KarhooUISDK.xcodeproj/xcshareddata/xcschemes/KarhooUISDKTests.xcscheme +++ b/KarhooUISDK.xcodeproj/xcshareddata/xcschemes/KarhooUISDKTests.xcscheme @@ -20,20 +20,6 @@ ReferencedContainer = "container:KarhooUISDK.xcodeproj"> - - - - - - - - diff --git a/KarhooUISDK/Builders/TripSummaryScreenBuilder.swift b/KarhooUISDK/Builders/TripSummaryScreenBuilder.swift index e8e067d30..da6b537d3 100644 --- a/KarhooUISDK/Builders/TripSummaryScreenBuilder.swift +++ b/KarhooUISDK/Builders/TripSummaryScreenBuilder.swift @@ -11,5 +11,5 @@ import KarhooSDK internal protocol TripSummaryScreenBuilder { func buildTripSummaryScreen(trip: TripInfo, - callback: @escaping ScreenResultCallback) -> Screen + callback: @escaping ScreenResultCallback) -> Screen } diff --git a/KarhooUISDK/Classes/CancelRideBehaviour.swift b/KarhooUISDK/Classes/CancelRideBehaviour.swift index 7d7bdd804..3eace9c7f 100644 --- a/KarhooUISDK/Classes/CancelRideBehaviour.swift +++ b/KarhooUISDK/Classes/CancelRideBehaviour.swift @@ -12,61 +12,87 @@ import KarhooSDK protocol CancelRideDelegate: AnyObject { func showLoadingOverlay() func hideLoadingOverlay() - func sendCancelRideNetworkRequest(callback: @escaping CallbackClosure) + func handleSuccessfulCancellation() } protocol CancelRideBehaviourProtocol: AnyObject { var delegate: CancelRideDelegate? { get set } - func triggerCancelRide() + func cancelPressed() } final class CancelRideBehaviour: CancelRideBehaviourProtocol { private(set) var trip: TripInfo + private let tripService: TripService private let alertHandler: AlertHandlerProtocol private let phoneNumberCaller: PhoneNumberCallerProtocol public weak var delegate: CancelRideDelegate? public init(trip: TripInfo, + tripService: TripService = Karhoo.getTripService(), delegate: CancelRideDelegate? = nil, alertHandler: AlertHandlerProtocol, phoneNumberCaller: PhoneNumberCallerProtocol = PhoneNumberCaller()) { self.trip = trip + self.tripService = tripService self.delegate = delegate self.alertHandler = alertHandler self.phoneNumberCaller = phoneNumberCaller } - - public func triggerCancelRide() { - showConfirmCancelRideAlert() + + public func cancelPressed() { + delegate?.showLoadingOverlay() + + tripService.cancellationFee(identifier: getTripIdentifier()) + .execute(callback: { [weak self] result in + self?.delegate?.hideLoadingOverlay() + guard let self = self else { + return + } + + if result.isSuccess() { + self.showCancellationFeeAlert(cancellationFee: result.successValue() ?? CancellationFee()) + } else { + self.showCancellationFailedAlert() + } + }) + } + + private func getTripIdentifier() -> String { + if Karhoo.configuration.authenticationMethod().isGuest() { + return trip.followCode + } else { + return trip.tripId + } } private func cancelBookingConfirmed() { delegate?.showLoadingOverlay() - delegate?.sendCancelRideNetworkRequest { [weak self] result in - self?.delegate?.hideLoadingOverlay() + let tripCancellation = TripCancellation(tripId: getTripIdentifier(), cancelReason: .notNeededAnymore) - if result.errorValue() != nil { - self?.showCancellationFailedAlert() - } - } + tripService.cancel(tripCancellation: tripCancellation) + .execute(callback: { [weak self] result in + self?.delegate?.hideLoadingOverlay() + guard let self = self else { + return + } + + if result.isSuccess() { + _ = self.alertHandler.show(title: UITexts.Bookings.cancellationSuccessAlertTitle, + message: UITexts.Bookings.cancellationSuccessAlertMessage, + actions: [AlertAction(title: UITexts.Generic.ok, style: .default, handler: { [weak self] _ in + self?.delegate?.handleSuccessfulCancellation() + })]) + } else { + self.showCancellationFailedAlert() + } + }) } private func callFleetPressed() { phoneNumberCaller.call(number: trip.fleetInfo.phoneNumber) } - private func showConfirmCancelRideAlert() { - _ = alertHandler.show(title: UITexts.Trip.tripCancelBookingConfirmationAlertTitle, - message: UITexts.Trip.tripCancelBookingConfirmationAlertMessage, - actions: [ - AlertAction(title: UITexts.Generic.no, style: .default, handler: nil), - AlertAction(title: UITexts.Generic.yes, style: .default, handler: { [weak self] _ in - self?.cancelBookingConfirmed() - }) - ]) - } - private func showCancellationFailedAlert() { let callFleet = UITexts.Trip.tripCancelBookingFailedAlertCallFleetButton @@ -79,4 +105,29 @@ final class CancelRideBehaviour: CancelRideBehaviourProtocol { }) ]) } + + func showCancellationFeeAlert(cancellationFee: CancellationFee) { + let message: String + if cancellationFee.fee.value > 0 { + let feeString = CurrencyCodeConverter.toPriceString(price: cancellationFee.fee.value, currencyCode: cancellationFee.fee.currency) + message = String(format: UITexts.Bookings.cancellationFeeCharge, feeString) + } else { + message = UITexts.Bookings.cancellationFeeContinue + } + + _ = alertHandler.show(title: UITexts.Trip.tripCancelBookingConfirmationAlertTitle, + message: message, + actions: [ + AlertAction(title: UITexts.Generic.no, style: .default, handler: { [weak self] _ in + self?.delegate?.hideLoadingOverlay() + }), + AlertAction(title: UITexts.Generic.yes, style: .default, handler: { [weak self] _ in + self?.cancelBookingConfirmed() + }) + ]) + } + + private func hideOverlay() { + + } } diff --git a/KarhooUISDK/Classes/Payment/AddCard/AdyenCardRegistrationFlow.swift b/KarhooUISDK/Classes/Payment/AddCard/AdyenCardRegistrationFlow.swift index ad0e4ab65..328fab472 100644 --- a/KarhooUISDK/Classes/Payment/AddCard/AdyenCardRegistrationFlow.swift +++ b/KarhooUISDK/Classes/Payment/AddCard/AdyenCardRegistrationFlow.swift @@ -19,8 +19,10 @@ final class AdyenCardRegistrationFlow: CardRegistrationFlow { private var tripId: String = "" private var amount: Int = 0 private var currencyCode: String = "" + private var supplierPartnerId: String = "" private let adyenResponseHandler: AdyenResponseHandler private let paymentFactory: PaymentFactory + private let threeDSecureUtil: ThreeDSecureUtils private var adyenAmout: AdyenAmount { return AdyenAmount(currency: self.currencyCode, value: self.amount) @@ -28,10 +30,12 @@ final class AdyenCardRegistrationFlow: CardRegistrationFlow { init(paymentService: PaymentService = Karhoo.getPaymentService(), adyenResponseHandler: AdyenResponseHandler = AdyenResponseHandler(), - paymentFactory: PaymentFactory = PaymentFactory()) { + paymentFactory: PaymentFactory = PaymentFactory(), + threeDSecureUtil: ThreeDSecureUtils = AdyenThreeDSecureUtils()) { self.paymentService = paymentService self.adyenResponseHandler = adyenResponseHandler self.paymentFactory = paymentFactory + self.threeDSecureUtil = threeDSecureUtil } func setBaseView(_ baseViewController: BaseViewController?) { @@ -40,10 +44,12 @@ final class AdyenCardRegistrationFlow: CardRegistrationFlow { func start(cardCurrency: String, amount: Int, + supplierPartnerId: String, showUpdateCardAlert: Bool, callback: @escaping (OperationResult) -> Void) { self.currencyCode = cardCurrency self.amount = amount + self.supplierPartnerId = supplierPartnerId self.callback = callback baseViewController?.showLoadingOverlay(true) @@ -85,6 +91,7 @@ final class AdyenCardRegistrationFlow: CardRegistrationFlow { let configuration = DropInComponent.PaymentMethodsConfiguration() configuration.card.publicKey = adyenKey configuration.card.showsStorePaymentMethodField = showStorePaymentMethod + configuration.card.showsHolderNameField = true guard let methods = paymentMethods else { finish(result: .completed(value: .didFailWithError(nil))) @@ -105,8 +112,19 @@ final class AdyenCardRegistrationFlow: CardRegistrationFlow { } private func finish(result: OperationResult) { - adyenDropIn?.viewController.dismiss(animated: true, completion: nil) - self.callback?(result) + if let presentedViewController = adyenDropIn?.viewController.presentedViewController { + presentedViewController.dismiss(animated: true) { + self.closeAdyenDropIn(result: result) + } + } else { + self.closeAdyenDropIn(result: result) + } + } + + private func closeAdyenDropIn(result: OperationResult) { + adyenDropIn?.viewController.dismiss(animated: true) { + self.callback?(result) + } } } @@ -133,9 +151,10 @@ extension AdyenCardRegistrationFlow: DropInComponentDelegate { adyenPayload.amount = adyenAmout adyenPayload.additionalData = ["allow3DS2": "true"] adyenPayload.storePaymentMethod = storePaymentMethod + adyenPayload.returnUrl = self.threeDSecureUtil.current3DSReturnUrl + adyenPayload.browserInfo = AdyenBrowserInfo(userAgent: self.threeDSecureUtil.userAgent, acceptHeader: self.threeDSecureUtil.acceptHeader) - let request = AdyenPaymentsRequest(paymentsPayload: adyenPayload, - returnUrlSuffix: "") + let request = AdyenPaymentsRequest(paymentsPayload: adyenPayload, supplyPartnerID: self.supplierPartnerId) paymentService.adyenPayments(request: request).execute { [weak self] result in guard let self = self else { return } @@ -213,10 +232,10 @@ extension AdyenCardRegistrationFlow: DropInComponentDelegate { finish(result: .completed(value: .didAddPaymentMethod(method: method))) case .requiresAction(let action): adyenDropIn?.handle(action) - case .refused(let reason): - finish(result: .completed(value: .didFailWithError(ErrorModel(message: reason)))) + case .refused(let reason, let code): + finish(result: .completed(value: .didFailWithError(ErrorModel(message: reason, code: code)))) case .handleResult(let code): - finish(result: .completed(value: .didFailWithError(ErrorModel(message: code ?? UITexts.Errors.noDetailsAvailable)))) + finish(result: .completed(value: .didFailWithError(ErrorModel(message: code ?? UITexts.Errors.noDetailsAvailable, code: code ?? UITexts.Errors.noDetailsAvailable)))) } } } diff --git a/KarhooUISDK/Classes/Payment/AddCard/AdyenResponseHandler.swift b/KarhooUISDK/Classes/Payment/AddCard/AdyenResponseHandler.swift index 3b4fab82b..73eb9216c 100644 --- a/KarhooUISDK/Classes/Payment/AddCard/AdyenResponseHandler.swift +++ b/KarhooUISDK/Classes/Payment/AddCard/AdyenResponseHandler.swift @@ -2,12 +2,12 @@ // AdyenResponseHandler.swift // KarhooUISDK // +// This class transforms adyen backend data into an event to progress the users payment trip +// https://docs.adyen.com/online-payments/ios/drop-in#step-4-additional-client-app +// // Copyright © 2020 Flit Technologies Ltd. All rights reserved. // -/*** this class transforms adyen backend data into an event to progress the users payment trip * - * https://docs.adyen.com/checkout/ios/drop-in#step-4-additional-client-app -*/ import Adyen struct AdyenResponseHandler { @@ -24,7 +24,7 @@ struct AdyenResponseHandler { enum AdyenEvent { case requiresAction(_ action: Action) case paymentAuthorised(_ method: PaymentMethod) - case refused(_ reason: String) + case refused(reason: String, code: String) case handleResult(code: String?) case failure } @@ -60,7 +60,7 @@ struct AdyenResponseHandler { } if result == refused { - return .refused((data[refusalReason] as? String) ?? UITexts.Errors.noDetailsAvailable) + return .refused(reason: (data[refusalReason] as? String) ?? UITexts.Errors.noDetailsAvailable, code: (data[resultCode] as? String) ?? UITexts.Errors.noDetailsAvailable) } return .handleResult(code: result) diff --git a/KarhooUISDK/Classes/Payment/AddCard/BraintreeCardRegistrationFlow.swift b/KarhooUISDK/Classes/Payment/AddCard/BraintreeCardRegistrationFlow.swift index 169abdb84..4bc02e006 100644 --- a/KarhooUISDK/Classes/Payment/AddCard/BraintreeCardRegistrationFlow.swift +++ b/KarhooUISDK/Classes/Payment/AddCard/BraintreeCardRegistrationFlow.swift @@ -34,6 +34,7 @@ public final class BraintreeCardRegistrationFlow: CardRegistrationFlow { public func start(cardCurrency: String, amount: Int, + supplierPartnerId: String, showUpdateCardAlert: Bool, callback: @escaping (OperationResult) -> Void) { self.callback = callback @@ -68,7 +69,8 @@ public final class BraintreeCardRegistrationFlow: CardRegistrationFlow { self?.buildBraintreeUI(paymentsToken: token) } else { self?.baseViewController?.showAlert(title: UITexts.Generic.error, - message: UITexts.Errors.missingPaymentSDKToken) + message: UITexts.Errors.missingPaymentSDKToken, + error: result.errorValue()) self?.callback?(.completed(value: .didFailWithError(result.errorValue()))) } } @@ -87,7 +89,8 @@ public final class BraintreeCardRegistrationFlow: CardRegistrationFlow { private func didBuildBraintreeUIScreen(_ result: ScreenResult) { guard let item = result.completedValue() else { baseViewController?.showAlert(title: UITexts.Generic.error, - message: UITexts.Errors.missingPaymentSDKToken) + message: UITexts.Errors.missingPaymentSDKToken, + error: result.errorValue()) return } diff --git a/KarhooUISDK/Classes/Payment/AddCard/CardRegistrationFlow.swift b/KarhooUISDK/Classes/Payment/AddCard/CardRegistrationFlow.swift index 0dba56470..05bb74286 100644 --- a/KarhooUISDK/Classes/Payment/AddCard/CardRegistrationFlow.swift +++ b/KarhooUISDK/Classes/Payment/AddCard/CardRegistrationFlow.swift @@ -13,6 +13,7 @@ public protocol CardRegistrationFlow { func setBaseView(_ baseViewController: BaseViewController?) func start(cardCurrency: String, amount: Int, + supplierPartnerId: String, showUpdateCardAlert: Bool, callback: @escaping (OperationResult) -> Void) } diff --git a/KarhooUISDK/Classes/Payment/NonceProvider/AdyenPaymentNonceProvider.swift b/KarhooUISDK/Classes/Payment/NonceProvider/AdyenPaymentNonceProvider.swift index da3fe3a5f..89ad34905 100644 --- a/KarhooUISDK/Classes/Payment/NonceProvider/AdyenPaymentNonceProvider.swift +++ b/KarhooUISDK/Classes/Payment/NonceProvider/AdyenPaymentNonceProvider.swift @@ -24,6 +24,7 @@ final class AdyenPaymentNonceProvider: PaymentNonceProvider { result: @escaping (OperationResult) -> Void) { cardFlow.start(cardCurrency: quote.price.currencyCode, amount: quote.price.intHighPrice, + supplierPartnerId: quote.fleet.id, showUpdateCardAlert: false, callback: { [weak self] cardFlowResult in switch cardFlowResult { diff --git a/KarhooUISDK/Classes/Payment/NonceProvider/BraintreePaymentNonceProvider.swift b/KarhooUISDK/Classes/Payment/NonceProvider/BraintreePaymentNonceProvider.swift index 1139c3de3..60faee963 100644 --- a/KarhooUISDK/Classes/Payment/NonceProvider/BraintreePaymentNonceProvider.swift +++ b/KarhooUISDK/Classes/Payment/NonceProvider/BraintreePaymentNonceProvider.swift @@ -48,7 +48,7 @@ final class BraintreePaymentNonceProvider: PaymentNonceProvider { case .success(let sdkToken): self?.sdkToken = sdkToken case .failure: - self?.callbackResult?(.completed(value: .failedToInitialisePaymentService)) + self?.callbackResult?(.completed(value: .failedToInitialisePaymentService(error: result.errorValue()))) return } } @@ -75,6 +75,7 @@ final class BraintreePaymentNonceProvider: PaymentNonceProvider { private func triggerAddCardFlow(currencyCode: String) { self.cardRegistrationFlow.start(cardCurrency: currencyCode, amount: 0, + supplierPartnerId: "", showUpdateCardAlert: true, callback: { [weak self] result in switch result { @@ -99,7 +100,7 @@ final class BraintreePaymentNonceProvider: PaymentNonceProvider { } guard self.sdkToken != nil else { - self.callbackResult?(.completed(value: .failedToInitialisePaymentService)) + self.callbackResult?(.completed(value: .failedToInitialisePaymentService(error: nil))) return } @@ -120,7 +121,7 @@ final class BraintreePaymentNonceProvider: PaymentNonceProvider { func handleThreeDSecureCheck(_ result: ThreeDSecureCheckResult) { switch result { case .failedToInitialisePaymentService: - self.callbackResult?(.completed(value: .failedToInitialisePaymentService)) + self.callbackResult?(.completed(value: .failedToInitialisePaymentService(error: nil))) case .threeDSecureAuthenticationFailed: triggerAddCardFlow(currencyCode: quote.price.currencyCode) case .success(let threeDSecureNonce): diff --git a/KarhooUISDK/Classes/Payment/NonceProvider/PaymentNonceProvider.swift b/KarhooUISDK/Classes/Payment/NonceProvider/PaymentNonceProvider.swift index f582e3922..8fd57e9f6 100644 --- a/KarhooUISDK/Classes/Payment/NonceProvider/PaymentNonceProvider.swift +++ b/KarhooUISDK/Classes/Payment/NonceProvider/PaymentNonceProvider.swift @@ -12,7 +12,7 @@ import KarhooSDK enum PaymentNonceProviderResult { case nonce(nonce: Nonce) case threeDSecureCheckFailed - case failedToInitialisePaymentService + case failedToInitialisePaymentService(error: KarhooError?) case failedToAddCard(error: KarhooError?) case cancelledByUser } diff --git a/KarhooUISDK/Classes/Payment/ThreeDSecure/AdyenThreeDSecureUtils.swift b/KarhooUISDK/Classes/Payment/ThreeDSecure/AdyenThreeDSecureUtils.swift new file mode 100644 index 000000000..581d0cd8a --- /dev/null +++ b/KarhooUISDK/Classes/Payment/ThreeDSecure/AdyenThreeDSecureUtils.swift @@ -0,0 +1,31 @@ +// +// AdyenThreeDSecureUtils.swift +// KarhooSDK +// +// Created by Mostafa Hadian on 04/03/2021. +// + +import Foundation + +public struct AdyenThreeDSecureUtils: ThreeDSecureUtils { + public init() {} + + public var userAgent: String { + return "KH/UISDK/iOS/\(KarhooUISDKVersionNumber)" + } + + public var acceptHeader = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" + + public var current3DSReturnUrl: String { + "\(current3DSReturnUrlScheme)://" + } + + public var current3DSReturnUrlScheme: String { + guard let bundleId = Bundle.main.bundleIdentifier else { + return "" + } + + return "\(bundleId).adyen" + } + +} diff --git a/KarhooUISDK/Classes/Payment/ThreeDSecure/ThreeDSecureProvider.swift b/KarhooUISDK/Classes/Payment/ThreeDSecure/ThreeDSecureProvider.swift index 9293c9b47..c5442a29a 100644 --- a/KarhooUISDK/Classes/Payment/ThreeDSecure/ThreeDSecureProvider.swift +++ b/KarhooUISDK/Classes/Payment/ThreeDSecure/ThreeDSecureProvider.swift @@ -16,6 +16,13 @@ enum ThreeDSecureCheckResult { case failedToInitialisePaymentService } +protocol ThreeDSecureUtils { + var userAgent: String { get } + var acceptHeader: String { get } + var current3DSReturnUrl: String { get } + var current3DSReturnUrlScheme: String { get } +} + protocol ThreeDSecureProvider { func threeDSecureCheck(nonce: String, diff --git a/KarhooUISDK/Common/AddressBarMVP/KarhooAddressBarView.swift b/KarhooUISDK/Common/AddressBarMVP/KarhooAddressBarView.swift index db5be6d4d..8c2412ca5 100644 --- a/KarhooUISDK/Common/AddressBarMVP/KarhooAddressBarView.swift +++ b/KarhooUISDK/Common/AddressBarMVP/KarhooAddressBarView.swift @@ -31,6 +31,8 @@ public class KarhooAddressBarView: UIView, AddressBarView { private var iconsConnectorLine: LineView! private var swapButton: UIButton! private var mainViewContainer: UIView! + private var destinationIconWidthConstraint: NSLayoutConstraint! + private var destinationIconHeightConstraint: NSLayoutConstraint! private var presenter: AddressBarPresenter? private let dropShadow: Bool @@ -39,6 +41,7 @@ public class KarhooAddressBarView: UIView, AddressBarView { private let verticalPadding: CGFloat private let horizontalPadding: CGFloat private let hidePickUpDestinationConnector: Bool + private let destinationIconSize: CGFloat = 18.0 init(cornerRadious: CGFloat = 5.0, borderLine: Bool = false, @@ -173,13 +176,14 @@ public class KarhooAddressBarView: UIView, AddressBarView { destinationField.bottomAnchor.constraint(equalTo: mainViewContainer.bottomAnchor), destinationField.leadingAnchor.constraint(equalTo: pickupField.leadingAnchor)].map { $0.isActive = true } - let destinationIconSize: CGFloat = 18.0 - _ = [destinationIcon.widthAnchor.constraint(equalToConstant: destinationIconSize), - destinationIcon.heightAnchor.constraint(equalToConstant: destinationIconSize), - destinationIcon.centerXAnchor.constraint(equalTo: pickUpIcon.centerXAnchor), + destinationIconWidthConstraint = destinationIcon.widthAnchor.constraint(equalToConstant: destinationIconSize) + destinationIconHeightConstraint = destinationIcon.heightAnchor.constraint(equalToConstant: destinationIconSize) + destinationIconWidthConstraint.isActive = true + destinationIconHeightConstraint.isActive = true + _ = [destinationIcon.centerXAnchor.constraint(equalTo: pickUpIcon.centerXAnchor), destinationIcon.centerYAnchor.constraint(equalTo: destinationField.centerYAnchor)] .map { $0.isActive = true } - destinationIcon.layer.cornerRadius = iconSize / 2 + destinationIcon.layer.cornerRadius = destinationIconSize / 2 _ = [iconsConnectorLine.centerXAnchor.constraint(equalTo: pickUpIcon.centerXAnchor), iconsConnectorLine.topAnchor.constraint(equalTo: pickUpIcon.bottomAnchor), @@ -225,7 +229,7 @@ public class KarhooAddressBarView: UIView, AddressBarView { destinationField.set(text: destinationDisplayAddress) if destinationDisplayAddress != nil && destinationDisplayAddress != UITexts.AddressBar.addDestination { destinationIcon.image = nil - destinationIcon.transform = CGAffineTransform(scaleX: 0.5, y: 0.5) + toggleDestinationIconSize(big: false) destinationIcon.backgroundColor = KarhooUI.colors.primary } } @@ -233,11 +237,18 @@ public class KarhooAddressBarView: UIView, AddressBarView { public func destinationSetState(disableClearButton: Bool = false) { swapButton.isHidden = false destinationIcon.image = nil - destinationIcon.transform = CGAffineTransform(scaleX: 0.5, y: 0.5) + toggleDestinationIconSize(big: false) destinationIcon.backgroundColor = KarhooUI.colors.primary destinationField?.ordinaryTextColor() destinationField?.disableClear(disableClearButton) } + + private func toggleDestinationIconSize(big: Bool) { + let ratio: CGFloat = big == true ? 1 : 2 + destinationIconWidthConstraint.constant = destinationIconSize / ratio + destinationIconHeightConstraint.constant = destinationIconSize / ratio + destinationIcon.layer.cornerRadius = destinationIconSize / (ratio*2) + } public func pickupNotSetState() { swapButton?.isHidden = true @@ -251,6 +262,7 @@ public class KarhooAddressBarView: UIView, AddressBarView { public func destinationNotSetState() { swapButton.isHidden = true + toggleDestinationIconSize(big: true) destinationIcon.image = UIImage.uisdkImage("add_destination").withRenderingMode(.alwaysTemplate) destinationIcon.backgroundColor = .clear set(destinationDisplayAddress: UITexts.AddressBar.addDestination) diff --git a/KarhooUISDK/Common/ConstraintSwitcher/ConstraintSwitcher.swift b/KarhooUISDK/Common/ConstraintSwitcher/ConstraintSwitcher.swift index e7b3442a5..78d6ba60b 100755 --- a/KarhooUISDK/Common/ConstraintSwitcher/ConstraintSwitcher.swift +++ b/KarhooUISDK/Common/ConstraintSwitcher/ConstraintSwitcher.swift @@ -29,7 +29,7 @@ public typealias ConstraintSwitcherCompletedClosure = () -> Void public final class DefaultConstraintSwitcher: ConstraintSwitcher { - //Configuration + // Configuration fileprivate var animationTime = 0.75 fileprivate var primaryConstraints: [NSLayoutConstraint]? diff --git a/KarhooUISDK/Common/CurrencyCodeConverter.swift b/KarhooUISDK/Common/CurrencyCodeConverter.swift index b3cad7805..15b47c320 100644 --- a/KarhooUISDK/Common/CurrencyCodeConverter.swift +++ b/KarhooUISDK/Common/CurrencyCodeConverter.swift @@ -11,25 +11,33 @@ import KarhooSDK class CurrencyCodeConverter { + /// Format money amounts to String + /// + /// - Parameters: + /// - quote: The quote that has the price class func toPriceString(quote: Quote) -> String { - return toPriceString(price: quote.price.highPrice, currencyCode: quote.price.currencyCode) + return toPriceString(price: quote.price.intHighPrice, currencyCode: quote.price.currencyCode) } - class func toPriceString(price: Double, currencyCode: String) -> String { - let symbol = findCurrencySymbolByCode(currencyCode: currencyCode) - - if symbol.isEmpty { + /// Format money amounts to String + /// + /// - Parameters: + /// - price: The price in cents or similar (Ex: for 1$ input 100) + /// - currencyCode: The currency code (Ex: GBP) + class func toPriceString(price: Int, currencyCode: String) -> String { + if let price = CurrencyCodeConverter.formatted(amount: price, currencyCode: currencyCode) { + return price + } else { return UITexts.Bookings.priceCancelled } - - return String(format: "%@%.2f", symbol, price) } + class func quoteRangePrice(quote: Quote) -> String { - let highPrice = toPriceString(price: quote.price.highPrice, currencyCode: quote.price.currencyCode) - let lowPrice = toPriceString(price: quote.price.lowPrice, currencyCode: quote.price.currencyCode) + let highPrice = CurrencyCodeConverter.formatted(amount: quote.price.intHighPrice, currencyCode: quote.price.currencyCode) + let lowPrice = CurrencyCodeConverter.formatted(amount: quote.price.intLowPrice, currencyCode: quote.price.currencyCode) - return "\(lowPrice) - \(highPrice)" + return "\(lowPrice ?? "") - \(highPrice ?? "")" } private static func findCurrencySymbolByCode(currencyCode: String) -> String { @@ -54,4 +62,67 @@ class CurrencyCodeConverter { } return nil } + + /// Format money amounts. + /// + /// - Parameters: + /// - amount: The amount in minor units. + /// - currencyCode: The code of the currency. + private static func formatted(amount: Int, currencyCode: String) -> String? { + let decimalAmount = CurrencyCodeConverter.decimalAmount(amount, currencyCode: currencyCode) + return defaultFormatter(currencyCode: currencyCode).string(from: decimalAmount) + } + + /// Converts an amount in major currency unit to an amount in minor currency units. + /// + /// - Parameters: + /// - majorUnitAmount: The amount in major currency units. + /// - currencyCode: The code of the currency. + private static func minorUnitAmount(from majorUnitAmount: Double, currencyCode: String) -> Int { + let maximumFractionDigits = CurrencyCodeConverter.maximumFractionDigits(for: currencyCode) + return Int(majorUnitAmount * pow(Double(10), Double(maximumFractionDigits))) + } + + private static func decimalAmount(_ amount: Int, currencyCode: String) -> NSDecimalNumber { + let defaultFormatter = CurrencyCodeConverter.defaultFormatter(currencyCode: currencyCode) + let maximumFractionDigits = CurrencyCodeConverter.maximumFractionDigits(for: currencyCode) + defaultFormatter.maximumFractionDigits = maximumFractionDigits + + let decimalMinorAmount = NSDecimalNumber(value: amount) + let convertedAmount = decimalMinorAmount.multiplying(byPowerOf10: Int16(-maximumFractionDigits)).doubleValue + return NSDecimalNumber(value: convertedAmount) + } + + private static func defaultFormatter(currencyCode: String) -> NumberFormatter { + let formatter = NumberFormatter() + formatter.numberStyle = .currency + formatter.currencyCode = currencyCode + return formatter + } + + private static func maximumFractionDigits(for currencyCode: String) -> Int { + // For some currency codes iOS returns the wrong number of minor units. + // The below overrides are obtained from https://en.wikipedia.org/wiki/ISO_4217 + + switch currencyCode { + case "ISK", "CLP", "COP": + // iOS returns 0, which is in accordance with ISO-4217, but conflicts with the Adyen backend. + return 2 + case "MRO": + // iOS returns 0 instead. + return 1 + case "RSD": + // iOS returns 0 instead. + return 2 + case "CVE": + // iOS returns 2 instead. + return 0 + case "GHC": + // iOS returns 2 instead. + return 0 + default: + let formatter = defaultFormatter(currencyCode: currencyCode) + return formatter.maximumFractionDigits + } + } } diff --git a/KarhooUISDK/Common/DropDownButton.swift b/KarhooUISDK/Common/DropDownButton.swift index 7486008bb..8ac4d9b64 100644 --- a/KarhooUISDK/Common/DropDownButton.swift +++ b/KarhooUISDK/Common/DropDownButton.swift @@ -44,7 +44,7 @@ final class DropDownButton: UIView { buttonTitle = UILabel() buttonTitle.accessibilityIdentifier = KHDropDownButtonID.buttonTitle buttonTitle.translatesAutoresizingMaskIntoConstraints = false - buttonTitle.font = UIFont.systemFont(ofSize: 8, weight: .semibold) + buttonTitle.font = UIFont.systemFont(ofSize: 10, weight: .semibold) buttonTitle.textAlignment = .center buttonTitle.textColor = .darkGray buttonTitle.text = UITexts.Trip.tripRideOptions diff --git a/KarhooUISDK/Common/KarhooTextField/KarhooTextField.swift b/KarhooUISDK/Common/KarhooTextField/KarhooTextField.swift index 612fc0b3f..c1b3dc893 100644 --- a/KarhooUISDK/Common/KarhooTextField/KarhooTextField.swift +++ b/KarhooUISDK/Common/KarhooTextField/KarhooTextField.swift @@ -102,7 +102,7 @@ final class KarhooTextField: NibLoadableView, ValidatorListener { guard let input = inputField else { return } input.isSecureTextEntry = secureText - //Workaround to refresh the position of the cursor as the secureTextEntry toggle misplaces it + // Workaround to refresh the position of the cursor as the secureTextEntry toggle misplaces it let beginning = input.beginningOfDocument let end = input.endOfDocument input.selectedTextRange = input.textRange(from: beginning, to: beginning) diff --git a/KarhooUISDK/Common/KarhooTextField/KarhooTextField.xib b/KarhooUISDK/Common/KarhooTextField/KarhooTextField.xib index e262e1fa5..c92fcac4a 100644 --- a/KarhooUISDK/Common/KarhooTextField/KarhooTextField.xib +++ b/KarhooUISDK/Common/KarhooTextField/KarhooTextField.xib @@ -1,9 +1,9 @@ - + - + @@ -34,7 +34,9 @@