Skip to content

Commit f58c9ac

Browse files
authored
Merge pull request #8666 from woocommerce/issue/8664-disconnect-from-built-in-reader-when-manage-card-readers-tapped
[Mobile Payments] Disconnect built-in reader when Manage card readers is tapped
2 parents ad2305a + e3f9fcc commit f58c9ac

File tree

7 files changed

+174
-70
lines changed

7 files changed

+174
-70
lines changed
Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Combine
22
import Foundation
33
import Yosemite
44

5-
final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedViewModel {
5+
final class BluetoothCardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedViewModel {
66
private(set) var shouldShow: CardReaderSettingsTriState = .isUnknown
77
var didChangeShouldShow: ((CardReaderSettingsTriState) -> Void)?
88
var didUpdate: (() -> Void)?
@@ -97,6 +97,8 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
9797
guard let self = self else {
9898
return
9999
}
100+
101+
self.disconnectFromBuiltInReader(in: readers)
100102
self.readerUpdateError = nil
101103
self.didGetConnectedReaders = true
102104
self.connectedReaders = readers
@@ -145,13 +147,27 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
145147
ServiceLocator.stores.dispatch(softwareUpdateAction)
146148
}
147149

150+
/// This screen is only used for managing Bluetooth card readers.
151+
/// If we're connected to the built-in reader, we should disconnect, as users are unlikely to consider
152+
/// another part of their phone as something they connect to and manage.
153+
private func disconnectFromBuiltInReader(in readers: [CardReader]) {
154+
if readers.includesBuiltInReader() {
155+
self.disconnect()
156+
}
157+
}
158+
148159
private func updateProperties() {
149160
updateReaderID()
150161
updateBatteryLevel()
151162
updateSoftwareVersion()
152163
didUpdate?()
153164
}
154165

166+
private func disconnect() {
167+
let action = CardPresentPaymentAction.disconnect { _ in }
168+
ServiceLocator.stores.dispatch(action)
169+
}
170+
155171
private func updateReaderID() {
156172
connectedReaderID = connectedReaders.first?.id
157173
}
@@ -249,6 +265,10 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
249265
newShouldShow = .isUnknown
250266
} else if connectedReaders.isEmpty {
251267
newShouldShow = .isFalse
268+
} else if connectedReaders.includesBuiltInReader() {
269+
/// This screen only supports management of Bluetooth readers, and will have started disconnection
270+
/// the built-in reader in this instance.
271+
newShouldShow = .isFalse
252272
} else {
253273
newShouldShow = .isTrue
254274
}
@@ -263,9 +283,15 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
263283
}
264284
}
265285

286+
private extension [CardReader] {
287+
func includesBuiltInReader() -> Bool {
288+
return self.first(where: { $0.readerType == .appleBuiltIn }) != nil
289+
}
290+
}
291+
266292
// MARK: - Localization
267293
//
268-
private extension CardReaderSettingsConnectedViewModel {
294+
private extension BluetoothCardReaderSettingsConnectedViewModel {
269295
enum Localization {
270296
static let title = NSLocalizedString(
271297
"Connected Reader",

WooCommerce/Classes/ViewRelated/Dashboard/Settings/CardReadersV2/CardReaderSettingsConnectedViewController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ final class CardReaderSettingsConnectedViewController: UIViewController, CardRea
1313

1414
/// ViewModel
1515
///
16-
private var viewModel: CardReaderSettingsConnectedViewModel?
16+
private var viewModel: BluetoothCardReaderSettingsConnectedViewModel?
1717

1818
/// Table Sections to be rendered
1919
///
@@ -24,7 +24,7 @@ final class CardReaderSettingsConnectedViewController: UIViewController, CardRea
2424
/// Accept our viewmodel
2525
///
2626
func configure(viewModel: CardReaderSettingsPresentedViewModel) {
27-
self.viewModel = viewModel as? CardReaderSettingsConnectedViewModel
27+
self.viewModel = viewModel as? BluetoothCardReaderSettingsConnectedViewModel
2828

2929
guard self.viewModel != nil else {
3030
DDLogError("Unexpectedly unable to downcast to CardReaderSettingsConnectedViewModel")

WooCommerce/Classes/ViewRelated/Dashboard/Settings/CardReadersV2/CardReaderSettingsViewModelsOrderedList.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ final class CardReaderSettingsViewModelsOrderedList: CardReaderSettingsPrioritiz
4949

5050
viewModelsAndViews.append(
5151
CardReaderSettingsViewModelAndView(
52-
viewModel: CardReaderSettingsConnectedViewModel(
52+
viewModel: BluetoothCardReaderSettingsConnectedViewModel(
5353
didChangeShouldShow: { [weak self] state in
5454
self?.onDidChangeShouldShow(state)
5555
},

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -747,8 +747,8 @@
747747
31595CAD25E966380033F0FF /* ConnectedReaderTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 31595CAC25E966380033F0FF /* ConnectedReaderTableViewCell.xib */; };
748748
315E14F42698DA24000AD5FF /* PassKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 315E14F32698DA24000AD5FF /* PassKit.framework */; };
749749
316837DA25CCA90C00E36B2F /* OrderStatusListDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 316837D925CCA90C00E36B2F /* OrderStatusListDataSource.swift */; };
750-
3178C1F726409216000D771A /* CardReaderSettingsConnectedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3178C1F626409216000D771A /* CardReaderSettingsConnectedViewModel.swift */; };
751-
3178C1FD26409360000D771A /* CardReaderSettingsConnectedViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3178C1FC26409360000D771A /* CardReaderSettingsConnectedViewModelTests.swift */; };
750+
3178C1F726409216000D771A /* BluetoothCardReaderSettingsConnectedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3178C1F626409216000D771A /* BluetoothCardReaderSettingsConnectedViewModel.swift */; };
751+
3178C1FD26409360000D771A /* BluetoothCardReaderSettingsConnectedViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3178C1FC26409360000D771A /* BluetoothCardReaderSettingsConnectedViewModelTests.swift */; };
752752
317F679826420E9D00BA2A7A /* CardReaderSettingsViewModelsOrderedList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 317F679726420E9D00BA2A7A /* CardReaderSettingsViewModelsOrderedList.swift */; };
753753
318109DC25E5B51900EE0BE7 /* ImageTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 318109DB25E5B51900EE0BE7 /* ImageTableViewCell.swift */; };
754754
318109E225E5B55C00EE0BE7 /* ImageTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 318109E125E5B55C00EE0BE7 /* ImageTableViewCell.xib */; };
@@ -2818,8 +2818,8 @@
28182818
31595CAC25E966380033F0FF /* ConnectedReaderTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ConnectedReaderTableViewCell.xib; sourceTree = "<group>"; };
28192819
315E14F32698DA24000AD5FF /* PassKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PassKit.framework; path = System/Library/Frameworks/PassKit.framework; sourceTree = SDKROOT; };
28202820
316837D925CCA90C00E36B2F /* OrderStatusListDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderStatusListDataSource.swift; sourceTree = "<group>"; };
2821-
3178C1F626409216000D771A /* CardReaderSettingsConnectedViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardReaderSettingsConnectedViewModel.swift; sourceTree = "<group>"; };
2822-
3178C1FC26409360000D771A /* CardReaderSettingsConnectedViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardReaderSettingsConnectedViewModelTests.swift; sourceTree = "<group>"; };
2821+
3178C1F626409216000D771A /* BluetoothCardReaderSettingsConnectedViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BluetoothCardReaderSettingsConnectedViewModel.swift; sourceTree = "<group>"; };
2822+
3178C1FC26409360000D771A /* BluetoothCardReaderSettingsConnectedViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BluetoothCardReaderSettingsConnectedViewModelTests.swift; sourceTree = "<group>"; };
28232823
317F679726420E9D00BA2A7A /* CardReaderSettingsViewModelsOrderedList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardReaderSettingsViewModelsOrderedList.swift; sourceTree = "<group>"; };
28242824
318109DB25E5B51900EE0BE7 /* ImageTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageTableViewCell.swift; sourceTree = "<group>"; };
28252825
318109E125E5B55C00EE0BE7 /* ImageTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ImageTableViewCell.xib; sourceTree = "<group>"; };
@@ -5851,7 +5851,7 @@
58515851
03E471C1293A1F6B001A58AD /* BluetoothReaderConnectionAlertsProvider.swift */,
58525852
03E471C3293A1F8D001A58AD /* BuiltInReaderConnectionAlertsProvider.swift */,
58535853
03E471D32942096B001A58AD /* BuiltInCardReaderPaymentAlertsProvider.swift */,
5854-
3178C1F626409216000D771A /* CardReaderSettingsConnectedViewModel.swift */,
5854+
3178C1F626409216000D771A /* BluetoothCardReaderSettingsConnectedViewModel.swift */,
58555855
035C6DEA273EA12D00F70406 /* SoftwareUpdateTypeProperty.swift */,
58565856
314265B02645A07800500598 /* CardReaderSettingsConnectedViewController.swift */,
58575857
3188533B2639FE5800F66A9C /* CardReaderSettingsPresentedViewViewModel.swift */,
@@ -5872,7 +5872,7 @@
58725872
31F21B07263C8E1F0035B50A /* CardReaderSettings */ = {
58735873
isa = PBXGroup;
58745874
children = (
5875-
3178C1FC26409360000D771A /* CardReaderSettingsConnectedViewModelTests.swift */,
5875+
3178C1FC26409360000D771A /* BluetoothCardReaderSettingsConnectedViewModelTests.swift */,
58765876
31F21B01263C8E150035B50A /* CardReaderSettingsSearchingViewModelTests.swift */,
58775877
314DC4C0268D28B100444C9E /* CardReaderSettingsKnownReadersStorageTests.swift */,
58785878
);
@@ -11117,7 +11117,7 @@
1111711117
B9E4364E287589E200883CFA /* BadgeView.swift in Sources */,
1111811118
CC254F3826C43B52005F3C82 /* ShippingLabelCustomPackageFormViewModel.swift in Sources */,
1111911119
02F49ADC23BF3A0100FA0BFA /* ErrorSectionHeaderView.swift in Sources */,
11120-
3178C1F726409216000D771A /* CardReaderSettingsConnectedViewModel.swift in Sources */,
11120+
3178C1F726409216000D771A /* BluetoothCardReaderSettingsConnectedViewModel.swift in Sources */,
1112111121
CC6923AC26010D8D002FB669 /* LoginProloguePageViewController.swift in Sources */,
1112211122
4515C88D25D6BE540099C8E3 /* ShippingLabelAddressFormViewController.swift in Sources */,
1112311123
CE5F462A23AACA0A006B1A5C /* RefundDetailsDataSource.swift in Sources */,
@@ -11270,7 +11270,7 @@
1127011270
buildActionMask = 2147483647;
1127111271
files = (
1127211272
45C8B2692316B2440002FA77 /* BillingAddressTableViewCellTests.swift in Sources */,
11273-
3178C1FD26409360000D771A /* CardReaderSettingsConnectedViewModelTests.swift in Sources */,
11273+
3178C1FD26409360000D771A /* BluetoothCardReaderSettingsConnectedViewModelTests.swift in Sources */,
1127411274
02FE89C7231FAA4100E85EF8 /* MainTabBarControllerTests.swift in Sources */,
1127511275
B63AAF4B254AD2C6000B28A2 /* URL+SurveyViewControllerTests.swift in Sources */,
1127611276
D802548C26552F41001B2CC1 /* CardPresentModalProcessingTests.swift in Sources */,

WooCommerce/WooCommerceTests/Mocks/MockCardPresentPaymentsStoresManager.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ final class MockCardPresentPaymentsStoresManager: DefaultStoresManager {
1919
private var softwareUpdateSubject: CurrentValueSubject<CardReaderSoftwareUpdateState, Never> = .init(.none)
2020
private var paymentExtension: CardPresentPaymentGatewayExtension
2121

22+
var receivedActions: [CardPresentPaymentAction] = []
23+
2224
init(connectedReaders: [CardReader],
2325
discoveredReaders: [CardReader],
2426
sessionManager: SessionManager,
@@ -47,6 +49,7 @@ final class MockCardPresentPaymentsStoresManager: DefaultStoresManager {
4749
}
4850

4951
private func onCardPresentPaymentAction(action: CardPresentPaymentAction) {
52+
receivedActions.append(action)
5053
switch action {
5154
case .observeConnectedReaders(let onCompletion):
5255
onCompletion(connectedReaders)
@@ -88,6 +91,8 @@ final class MockCardPresentPaymentsStoresManager: DefaultStoresManager {
8891
onCompletion(Result.success(()))
8992
case .loadActivePaymentGatewayExtension(let onCompletion):
9093
onCompletion(paymentExtension)
94+
case .disconnect(let onCompletion):
95+
onCompletion(Result.success(()))
9196
default:
9297
fatalError("Not available")
9398
}

WooCommerce/WooCommerceTests/Mocks/MockCardReader.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,15 @@ struct MockCardReader {
4444
readerType: .wisepad3,
4545
locationId: nil)
4646
}
47+
48+
static func appleBuiltIn() -> CardReader {
49+
CardReader(serial: "APPLE-BUILT-IN-SIMULATOR-1",
50+
vendorIdentifier: "SIMULATOR",
51+
name: "Simulated Apple Built In Reader",
52+
status: .init(connected: false, remembered: false),
53+
softwareVersion: nil,
54+
batteryLevel: nil,
55+
readerType: .appleBuiltIn,
56+
locationId: "st_simulated")
57+
}
4758
}

0 commit comments

Comments
 (0)