diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index d65921add39..e4e3bb9b543 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -2,7 +2,7 @@ 13.9 ----- - +- [*] Payments: Location permissions request is not shown to TTP users who grant "Allow once" permission on first foregrounding the app any more [https://github.com/woocommerce/woocommerce-ios/pull/9821] 13.8 ----- diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/CardReaderSupportDeterminer.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/CardReaderSupportDeterminer.swift index 6173fe24a4c..ef7019bab98 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/CardReaderSupportDeterminer.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/CardReaderSupportDeterminer.swift @@ -1,17 +1,20 @@ import Foundation import Yosemite +import CoreLocation protocol CardReaderSupportDetermining { func connectedReader() async -> CardReader? func hasPreviousTapToPayUsage() async -> Bool func siteSupportsLocalMobileReader() -> Bool func deviceSupportsLocalMobileReader() async -> Bool + var locationIsAuthorized: Bool { get } } final class CardReaderSupportDeterminer: CardReaderSupportDetermining { private let stores: StoresManager private let configuration: CardPresentPaymentsConfiguration private let siteID: Int64 + private var locationManager: CLLocationManager = CLLocationManager() init(siteID: Int64, configuration: CardPresentPaymentsConfiguration = CardPresentConfigurationLoader().configuration, @@ -21,6 +24,17 @@ final class CardReaderSupportDeterminer: CardReaderSupportDetermining { self.stores = stores } + var locationIsAuthorized: Bool { + switch locationManager.authorizationStatus { + case .notDetermined, .restricted, .denied: + return false + case .authorizedAlways, .authorizedWhenInUse: + return true + @unknown default: + return false + } + } + @MainActor func connectedReader() async -> CardReader? { await withCheckedContinuation { continuation in diff --git a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/TapToPayReconnectionController.swift b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/TapToPayReconnectionController.swift index bfaf93b5610..7885320b9d3 100644 --- a/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/TapToPayReconnectionController.swift +++ b/WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/TapToPayReconnectionController.swift @@ -70,7 +70,8 @@ final class TapToPayReconnectionController { isReconnecting = true let supportDeterminer = supportDeterminer ?? CardReaderSupportDeterminer(siteID: siteID) Task { @MainActor in - guard supportDeterminer.siteSupportsLocalMobileReader(), + guard supportDeterminer.locationIsAuthorized, + supportDeterminer.siteSupportsLocalMobileReader(), await supportDeterminer.deviceSupportsLocalMobileReader(), await supportDeterminer.hasPreviousTapToPayUsage(), await supportDeterminer.connectedReader() == nil, diff --git a/WooCommerce/WooCommerceTests/Mocks/MockCardReaderSupportDeterminer.swift b/WooCommerce/WooCommerceTests/Mocks/MockCardReaderSupportDeterminer.swift index d040dd94700..869baf3febb 100644 --- a/WooCommerce/WooCommerceTests/Mocks/MockCardReaderSupportDeterminer.swift +++ b/WooCommerce/WooCommerceTests/Mocks/MockCardReaderSupportDeterminer.swift @@ -3,6 +3,12 @@ import Yosemite @testable import WooCommerce final class MockCardReaderSupportDeterminer: CardReaderSupportDetermining { + + var shouldReturnLocationIsAuthorized = false + var locationIsAuthorized: Bool { + return shouldReturnLocationIsAuthorized + } + var shouldReturnConnectedReader: CardReader? = nil func connectedReader() async -> CardReader? { return shouldReturnConnectedReader diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/TapToPayReconnectionControllerTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/TapToPayReconnectionControllerTests.swift index fbcaa45dd01..c6cb3d1a111 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/TapToPayReconnectionControllerTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/TapToPayReconnectionControllerTests.swift @@ -48,6 +48,7 @@ final class TapToPayReconnectionControllerTests: XCTestCase { func test_reconnectIfNeeded_calls_searchAndConnect_if_no_reader_connected_and_site_and_device_meet_requirements() throws { // Given let supportDeterminer = MockCardReaderSupportDeterminer() + supportDeterminer.shouldReturnLocationIsAuthorized = true supportDeterminer.shouldReturnConnectedReader = nil supportDeterminer.shouldReturnSiteSupportsLocalMobileReader = true supportDeterminer.shouldReturnDeviceSupportsLocalMobileReader = true @@ -69,6 +70,7 @@ final class TapToPayReconnectionControllerTests: XCTestCase { func test_reconnectIfNeeded_creates_a_new_connection_controller_with_expected_parameters() throws { // Given let supportDeterminer = MockCardReaderSupportDeterminer() + supportDeterminer.shouldReturnLocationIsAuthorized = true supportDeterminer.shouldReturnConnectedReader = nil supportDeterminer.shouldReturnSiteSupportsLocalMobileReader = true supportDeterminer.shouldReturnDeviceSupportsLocalMobileReader = true