Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import Combine
import Foundation
import Yosemite

final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedViewModel {
final class BluetoothCardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedViewModel {
private(set) var shouldShow: CardReaderSettingsTriState = .isUnknown
var didChangeShouldShow: ((CardReaderSettingsTriState) -> Void)?
var didUpdate: (() -> Void)?
Expand Down Expand Up @@ -97,6 +97,8 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
guard let self = self else {
return
}

self.disconnectFromBuiltInReader(in: readers)
self.readerUpdateError = nil
self.didGetConnectedReaders = true
self.connectedReaders = readers
Expand Down Expand Up @@ -145,13 +147,27 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
ServiceLocator.stores.dispatch(softwareUpdateAction)
}

/// This screen is only used for managing Bluetooth card readers.
/// If we're connected to the built-in reader, we should disconnect, as users are unlikely to consider
/// another part of their phone as something they connect to and manage.
private func disconnectFromBuiltInReader(in readers: [CardReader]) {
if readers.includesBuiltInReader() {
self.disconnect()
}
}

private func updateProperties() {
updateReaderID()
updateBatteryLevel()
updateSoftwareVersion()
didUpdate?()
}

private func disconnect() {
let action = CardPresentPaymentAction.disconnect { _ in }
ServiceLocator.stores.dispatch(action)
}

private func updateReaderID() {
connectedReaderID = connectedReaders.first?.id
}
Expand Down Expand Up @@ -249,6 +265,10 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
newShouldShow = .isUnknown
} else if connectedReaders.isEmpty {
newShouldShow = .isFalse
} else if connectedReaders.includesBuiltInReader() {
/// This screen only supports management of Bluetooth readers, and will have started disconnection
/// the built-in reader in this instance.
newShouldShow = .isFalse
} else {
newShouldShow = .isTrue
}
Expand All @@ -263,9 +283,15 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
}
}

private extension [CardReader] {
func includesBuiltInReader() -> Bool {
return self.first(where: { $0.readerType == .appleBuiltIn }) != nil
}
}

// MARK: - Localization
//
private extension CardReaderSettingsConnectedViewModel {
private extension BluetoothCardReaderSettingsConnectedViewModel {
enum Localization {
static let title = NSLocalizedString(
"Connected Reader",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ final class CardReaderSettingsConnectedViewController: UIViewController, CardRea

/// ViewModel
///
private var viewModel: CardReaderSettingsConnectedViewModel?
private var viewModel: BluetoothCardReaderSettingsConnectedViewModel?

/// Table Sections to be rendered
///
Expand All @@ -24,7 +24,7 @@ final class CardReaderSettingsConnectedViewController: UIViewController, CardRea
/// Accept our viewmodel
///
func configure(viewModel: CardReaderSettingsPresentedViewModel) {
self.viewModel = viewModel as? CardReaderSettingsConnectedViewModel
self.viewModel = viewModel as? BluetoothCardReaderSettingsConnectedViewModel

guard self.viewModel != nil else {
DDLogError("Unexpectedly unable to downcast to CardReaderSettingsConnectedViewModel")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ final class CardReaderSettingsViewModelsOrderedList: CardReaderSettingsPrioritiz

viewModelsAndViews.append(
CardReaderSettingsViewModelAndView(
viewModel: CardReaderSettingsConnectedViewModel(
viewModel: BluetoothCardReaderSettingsConnectedViewModel(
didChangeShouldShow: { [weak self] state in
self?.onDidChangeShouldShow(state)
},
Expand Down
16 changes: 8 additions & 8 deletions WooCommerce/WooCommerce.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -735,8 +735,8 @@
31595CAD25E966380033F0FF /* ConnectedReaderTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 31595CAC25E966380033F0FF /* ConnectedReaderTableViewCell.xib */; };
315E14F42698DA24000AD5FF /* PassKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 315E14F32698DA24000AD5FF /* PassKit.framework */; };
316837DA25CCA90C00E36B2F /* OrderStatusListDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 316837D925CCA90C00E36B2F /* OrderStatusListDataSource.swift */; };
3178C1F726409216000D771A /* CardReaderSettingsConnectedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3178C1F626409216000D771A /* CardReaderSettingsConnectedViewModel.swift */; };
3178C1FD26409360000D771A /* CardReaderSettingsConnectedViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3178C1FC26409360000D771A /* CardReaderSettingsConnectedViewModelTests.swift */; };
3178C1F726409216000D771A /* BluetoothCardReaderSettingsConnectedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3178C1F626409216000D771A /* BluetoothCardReaderSettingsConnectedViewModel.swift */; };
3178C1FD26409360000D771A /* BluetoothCardReaderSettingsConnectedViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3178C1FC26409360000D771A /* BluetoothCardReaderSettingsConnectedViewModelTests.swift */; };
317F679826420E9D00BA2A7A /* CardReaderSettingsViewModelsOrderedList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 317F679726420E9D00BA2A7A /* CardReaderSettingsViewModelsOrderedList.swift */; };
318109DC25E5B51900EE0BE7 /* ImageTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 318109DB25E5B51900EE0BE7 /* ImageTableViewCell.swift */; };
318109E225E5B55C00EE0BE7 /* ImageTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 318109E125E5B55C00EE0BE7 /* ImageTableViewCell.xib */; };
Expand Down Expand Up @@ -2793,8 +2793,8 @@
31595CAC25E966380033F0FF /* ConnectedReaderTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ConnectedReaderTableViewCell.xib; sourceTree = "<group>"; };
315E14F32698DA24000AD5FF /* PassKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PassKit.framework; path = System/Library/Frameworks/PassKit.framework; sourceTree = SDKROOT; };
316837D925CCA90C00E36B2F /* OrderStatusListDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderStatusListDataSource.swift; sourceTree = "<group>"; };
3178C1F626409216000D771A /* CardReaderSettingsConnectedViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardReaderSettingsConnectedViewModel.swift; sourceTree = "<group>"; };
3178C1FC26409360000D771A /* CardReaderSettingsConnectedViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardReaderSettingsConnectedViewModelTests.swift; sourceTree = "<group>"; };
3178C1F626409216000D771A /* BluetoothCardReaderSettingsConnectedViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BluetoothCardReaderSettingsConnectedViewModel.swift; sourceTree = "<group>"; };
3178C1FC26409360000D771A /* BluetoothCardReaderSettingsConnectedViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BluetoothCardReaderSettingsConnectedViewModelTests.swift; sourceTree = "<group>"; };
317F679726420E9D00BA2A7A /* CardReaderSettingsViewModelsOrderedList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardReaderSettingsViewModelsOrderedList.swift; sourceTree = "<group>"; };
318109DB25E5B51900EE0BE7 /* ImageTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageTableViewCell.swift; sourceTree = "<group>"; };
318109E125E5B55C00EE0BE7 /* ImageTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ImageTableViewCell.xib; sourceTree = "<group>"; };
Expand Down Expand Up @@ -5813,7 +5813,7 @@
03E471C1293A1F6B001A58AD /* BluetoothReaderConnectionAlertsProvider.swift */,
03E471C3293A1F8D001A58AD /* BuiltInReaderConnectionAlertsProvider.swift */,
03E471D32942096B001A58AD /* BuiltInCardReaderPaymentAlertsProvider.swift */,
3178C1F626409216000D771A /* CardReaderSettingsConnectedViewModel.swift */,
3178C1F626409216000D771A /* BluetoothCardReaderSettingsConnectedViewModel.swift */,
035C6DEA273EA12D00F70406 /* SoftwareUpdateTypeProperty.swift */,
314265B02645A07800500598 /* CardReaderSettingsConnectedViewController.swift */,
3188533B2639FE5800F66A9C /* CardReaderSettingsPresentedViewViewModel.swift */,
Expand All @@ -5834,7 +5834,7 @@
31F21B07263C8E1F0035B50A /* CardReaderSettings */ = {
isa = PBXGroup;
children = (
3178C1FC26409360000D771A /* CardReaderSettingsConnectedViewModelTests.swift */,
3178C1FC26409360000D771A /* BluetoothCardReaderSettingsConnectedViewModelTests.swift */,
31F21B01263C8E150035B50A /* CardReaderSettingsSearchingViewModelTests.swift */,
314DC4C0268D28B100444C9E /* CardReaderSettingsKnownReadersStorageTests.swift */,
);
Expand Down Expand Up @@ -11066,7 +11066,7 @@
B9E4364E287589E200883CFA /* BadgeView.swift in Sources */,
CC254F3826C43B52005F3C82 /* ShippingLabelCustomPackageFormViewModel.swift in Sources */,
02F49ADC23BF3A0100FA0BFA /* ErrorSectionHeaderView.swift in Sources */,
3178C1F726409216000D771A /* CardReaderSettingsConnectedViewModel.swift in Sources */,
3178C1F726409216000D771A /* BluetoothCardReaderSettingsConnectedViewModel.swift in Sources */,
CC6923AC26010D8D002FB669 /* LoginProloguePageViewController.swift in Sources */,
4515C88D25D6BE540099C8E3 /* ShippingLabelAddressFormViewController.swift in Sources */,
CE5F462A23AACA0A006B1A5C /* RefundDetailsDataSource.swift in Sources */,
Expand Down Expand Up @@ -11219,7 +11219,7 @@
buildActionMask = 2147483647;
files = (
45C8B2692316B2440002FA77 /* BillingAddressTableViewCellTests.swift in Sources */,
3178C1FD26409360000D771A /* CardReaderSettingsConnectedViewModelTests.swift in Sources */,
3178C1FD26409360000D771A /* BluetoothCardReaderSettingsConnectedViewModelTests.swift in Sources */,
02FE89C7231FAA4100E85EF8 /* MainTabBarControllerTests.swift in Sources */,
B63AAF4B254AD2C6000B28A2 /* URL+SurveyViewControllerTests.swift in Sources */,
D802548C26552F41001B2CC1 /* CardPresentModalProcessingTests.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ final class MockCardPresentPaymentsStoresManager: DefaultStoresManager {
private var softwareUpdateSubject: CurrentValueSubject<CardReaderSoftwareUpdateState, Never> = .init(.none)
private var paymentExtension: CardPresentPaymentGatewayExtension

var receivedActions: [CardPresentPaymentAction] = []

init(connectedReaders: [CardReader],
discoveredReaders: [CardReader],
sessionManager: SessionManager,
Expand Down Expand Up @@ -47,6 +49,7 @@ final class MockCardPresentPaymentsStoresManager: DefaultStoresManager {
}

private func onCardPresentPaymentAction(action: CardPresentPaymentAction) {
receivedActions.append(action)
switch action {
case .observeConnectedReaders(let onCompletion):
onCompletion(connectedReaders)
Expand Down Expand Up @@ -88,6 +91,8 @@ final class MockCardPresentPaymentsStoresManager: DefaultStoresManager {
onCompletion(Result.success(()))
case .loadActivePaymentGatewayExtension(let onCompletion):
onCompletion(paymentExtension)
case .disconnect(let onCompletion):
onCompletion(Result.success(()))
default:
fatalError("Not available")
}
Expand Down
11 changes: 11 additions & 0 deletions WooCommerce/WooCommerceTests/Mocks/MockCardReader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,15 @@ struct MockCardReader {
readerType: .wisepad3,
locationId: nil)
}

static func appleBuiltIn() -> CardReader {
CardReader(serial: "APPLE-BUILT-IN-SIMULATOR-1",
vendorIdentifier: "SIMULATOR",
name: "Simulated Apple Built In Reader",
status: .init(connected: false, remembered: false),
softwareVersion: nil,
batteryLevel: nil,
readerType: .appleBuiltIn,
locationId: "st_simulated")
}
}
Loading