Skip to content

Commit f341fe0

Browse files
authored
Merge pull request #4992 from woocommerce/issue/4990-display-version
[Mobile Payments] Add display of reader software version to connected view
2 parents 99b6572 + e0e0c81 commit f341fe0

File tree

6 files changed

+116
-33
lines changed

6 files changed

+116
-33
lines changed

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

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,8 @@ private extension CardReaderSettingsConnectedViewController {
203203
private func configureConnectedReader(cell: ConnectedReaderTableViewCell) {
204204
let cellViewModel = ConnectedReaderTableViewCell.ViewModel(
205205
name: viewModel?.connectedReaderID,
206-
batteryLevel: viewModel?.connectedReaderBatteryLevel
206+
batteryLevel: viewModel?.connectedReaderBatteryLevel,
207+
softwareVersion: viewModel?.connectedReaderSoftwareVersion
207208
)
208209
cell.configure(viewModel: cellViewModel)
209210
cell.selectionStyle = .none
@@ -288,12 +289,6 @@ extension CardReaderSettingsConnectedViewController: UITableViewDataSource {
288289
// MARK: - UITableViewDelegate Conformance
289290
//
290291
extension CardReaderSettingsConnectedViewController: UITableViewDelegate {
291-
292-
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
293-
let row = rowAtIndexPath(indexPath)
294-
return row.height
295-
}
296-
297292
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
298293
tableView.deselectRow(at: indexPath, animated: true)
299294
}
@@ -340,15 +335,6 @@ private enum Row: CaseIterable {
340335
}
341336
}
342337

343-
var height: CGFloat {
344-
switch self {
345-
case .connectedReader:
346-
return 60
347-
default:
348-
return UITableView.automaticDimension
349-
}
350-
}
351-
352338
var reuseIdentifier: String {
353339
return type.reuseIdentifier
354340
}

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

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
1818

1919
var connectedReaderID: String?
2020
var connectedReaderBatteryLevel: String?
21+
var connectedReaderSoftwareVersion: String?
2122

2223
init(didChangeShouldShow: ((CardReaderSettingsTriState) -> Void)?, knownReadersProvider: CardReaderSettingsKnownReadersProvider? = nil) {
2324
self.didChangeShouldShow = didChangeShouldShow
@@ -43,15 +44,17 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
4344
}
4445

4546
private func updateProperties() {
46-
guard connectedReaders.count > 0 else {
47-
connectedReaderID = nil
48-
connectedReaderBatteryLevel = nil
49-
return
50-
}
47+
updateReaderID()
48+
updateBatteryLevel()
49+
updateSoftwareVersion()
50+
}
5151

52-
connectedReaderID = connectedReaders[0].id
52+
private func updateReaderID() {
53+
connectedReaderID = connectedReaders.first?.id
54+
}
5355

54-
guard let batteryLevel = connectedReaders[0].batteryLevel else {
56+
private func updateBatteryLevel() {
57+
guard let batteryLevel = connectedReaders.first?.batteryLevel else {
5558
connectedReaderBatteryLevel = Localization.unknownBatteryStatus
5659
return
5760
}
@@ -61,6 +64,15 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
6164
connectedReaderBatteryLevel = String.localizedStringWithFormat(Localization.batteryLabelFormat, batteryLevelString)
6265
}
6366

67+
private func updateSoftwareVersion() {
68+
guard let softwareVersion = connectedReaders.first?.softwareVersion else {
69+
connectedReaderSoftwareVersion = Localization.unknownSoftwareVersion
70+
return
71+
}
72+
73+
connectedReaderSoftwareVersion = String.localizedStringWithFormat(Localization.versionLabelFormat, softwareVersion)
74+
}
75+
6476
/// Dispatch a request to check for reader updates
6577
///
6678
func checkForCardReaderUpdate() {
@@ -178,5 +190,15 @@ private extension CardReaderSettingsConnectedViewModel {
178190
"%1$@%% Battery",
179191
comment: "Card reader battery level as an integer percentage"
180192
)
193+
194+
static let unknownSoftwareVersion = NSLocalizedString(
195+
"Unknown Software Version",
196+
comment: "Displayed in the unlikely event a card reader has an indeterminate software version"
197+
)
198+
199+
static let versionLabelFormat = NSLocalizedString(
200+
"Version: %1$@",
201+
comment: "Displays the connected reader software version"
202+
)
181203
}
182204
}

WooCommerce/Classes/ViewRelated/Dashboard/Settings/CardReadersV2/CardReaderTableViewCells/ConnectedReaderTableViewCell.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@ final class ConnectedReaderTableViewCell: UITableViewCell {
44
struct ViewModel {
55
let name: String?
66
let batteryLevel: String?
7+
let softwareVersion: String?
78
}
89

910
@IBOutlet private weak var nameLabel: UILabel!
1011
@IBOutlet private weak var batteryLevelLabel: UILabel!
12+
@IBOutlet private weak var softwareVersionLabel: UILabel!
1113

1214
private var viewModel: ViewModel?
1315

1416
func configure(viewModel: ViewModel) {
1517
self.viewModel = viewModel
1618
nameLabel.text = viewModel.name
1719
batteryLevelLabel.text = viewModel.batteryLevel
20+
softwareVersionLabel.text = viewModel.softwareVersion
1821
}
1922
}

WooCommerce/Classes/ViewRelated/Dashboard/Settings/CardReadersV2/CardReaderTableViewCells/ConnectedReaderTableViewCell.xib

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,35 @@
99
<objects>
1010
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
1111
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
12-
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="85" id="U1w-T7-U6Q" customClass="ConnectedReaderTableViewCell" customModule="WooCommerce" customModuleProvider="target">
13-
<rect key="frame" x="0.0" y="0.0" width="414" height="60"/>
12+
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="109" id="U1w-T7-U6Q" customClass="ConnectedReaderTableViewCell" customModule="WooCommerce" customModuleProvider="target">
13+
<rect key="frame" x="0.0" y="0.0" width="414" height="84"/>
1414
<autoresizingMask key="autoresizingMask"/>
15-
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="U1w-T7-U6Q" id="JJm-pT-xv2">
16-
<rect key="frame" x="0.0" y="0.0" width="414" height="60"/>
15+
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" ambiguous="YES" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="U1w-T7-U6Q" id="JJm-pT-xv2">
16+
<rect key="frame" x="0.0" y="0.0" width="414" height="84"/>
1717
<autoresizingMask key="autoresizingMask"/>
1818
<subviews>
1919
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="CHB204999999999" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="URa-xk-ZnX" userLabel="Name Label">
20-
<rect key="frame" x="20" y="9" width="374" height="21"/>
20+
<rect key="frame" x="20" y="9" width="374" height="20"/>
2121
<constraints>
22-
<constraint firstAttribute="height" constant="21" id="jdk-QY-NJg"/>
22+
<constraint firstAttribute="height" constant="20" id="jdk-QY-NJg"/>
2323
</constraints>
2424
<fontDescription key="fontDescription" type="system" pointSize="17"/>
2525
<nil key="textColor"/>
2626
<nil key="highlightedColor"/>
2727
</label>
2828
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="44% Battery" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rws-DM-4n4">
29-
<rect key="frame" x="20" y="32" width="374" height="20"/>
29+
<rect key="frame" x="20" y="34" width="374" height="15"/>
3030
<constraints>
31-
<constraint firstAttribute="height" constant="20" id="vhv-1f-sz5"/>
31+
<constraint firstAttribute="height" constant="15" id="vhv-1f-sz5"/>
32+
</constraints>
33+
<fontDescription key="fontDescription" type="system" pointSize="15"/>
34+
<color key="textColor" systemColor="secondaryLabelColor"/>
35+
<nil key="highlightedColor"/>
36+
</label>
37+
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Version: 1.00.03.34-SZZZ_Generic_v45-300001" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="h7d-re-rAr">
38+
<rect key="frame" x="20" y="54" width="374" height="15"/>
39+
<constraints>
40+
<constraint firstAttribute="height" constant="15" id="oaP-vs-GdN"/>
3241
</constraints>
3342
<fontDescription key="fontDescription" type="system" pointSize="15"/>
3443
<color key="textColor" systemColor="secondaryLabelColor"/>
@@ -38,17 +47,22 @@
3847
<constraints>
3948
<constraint firstItem="URa-xk-ZnX" firstAttribute="top" secondItem="JJm-pT-xv2" secondAttribute="top" constant="9" id="9ON-nS-TT9"/>
4049
<constraint firstItem="rws-DM-4n4" firstAttribute="leading" secondItem="JJm-pT-xv2" secondAttribute="leading" constant="20" id="9hB-FN-5re"/>
50+
<constraint firstItem="rws-DM-4n4" firstAttribute="top" secondItem="URa-xk-ZnX" secondAttribute="bottom" constant="5" id="F0v-xu-10B"/>
4151
<constraint firstItem="URa-xk-ZnX" firstAttribute="leading" secondItem="JJm-pT-xv2" secondAttribute="leading" constant="20" id="K23-JF-BdP"/>
42-
<constraint firstAttribute="bottom" secondItem="rws-DM-4n4" secondAttribute="bottom" constant="8" id="baC-l2-3kl"/>
52+
<constraint firstItem="h7d-re-rAr" firstAttribute="leading" secondItem="JJm-pT-xv2" secondAttribute="leading" constant="20" id="PGY-31-Zxl"/>
53+
<constraint firstAttribute="bottom" secondItem="h7d-re-rAr" secondAttribute="bottom" constant="5" id="erh-Dw-UEE"/>
54+
<constraint firstAttribute="trailing" secondItem="h7d-re-rAr" secondAttribute="trailing" constant="20" id="hci-eg-Umv"/>
4355
<constraint firstAttribute="trailing" secondItem="rws-DM-4n4" secondAttribute="trailing" constant="20" id="lVF-PB-1iC"/>
56+
<constraint firstItem="h7d-re-rAr" firstAttribute="top" secondItem="rws-DM-4n4" secondAttribute="bottom" constant="5" id="sNx-1F-8oV"/>
4457
<constraint firstAttribute="trailing" secondItem="URa-xk-ZnX" secondAttribute="trailing" constant="20" id="zX8-ar-MO5"/>
4558
</constraints>
4659
</tableViewCellContentView>
4760
<connections>
4861
<outlet property="batteryLevelLabel" destination="rws-DM-4n4" id="1o2-Jn-wjZ"/>
4962
<outlet property="nameLabel" destination="URa-xk-ZnX" id="1KX-pN-ZaW"/>
63+
<outlet property="softwareVersionLabel" destination="h7d-re-rAr" id="mUb-ni-70S"/>
5064
</connections>
51-
<point key="canvasLocation" x="24.637681159420293" y="115.51339285714285"/>
65+
<point key="canvasLocation" x="24.637681159420293" y="123.21428571428571"/>
5266
</tableViewCell>
5367
</objects>
5468
<resources>

WooCommerce/WooCommerceTests/Mocks/MockCardReader.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,14 @@ struct MockCardReader {
1010
batteryLevel: 0.5,
1111
readerType: .mobile)
1212
}
13+
14+
static func bbposChipper2XBTNoVerNoBatt() -> CardReader {
15+
CardReader(serial: "WPE-SIMULATOR-1",
16+
vendorIdentifier: "SIMULATOR",
17+
name: "Simulated POS E",
18+
status: .init(connected: false, remembered: false),
19+
softwareVersion: nil,
20+
batteryLevel: nil,
21+
readerType: .mobile)
22+
}
1323
}

WooCommerce/WooCommerceTests/ViewRelated/Dashboard/CardReaderSettings/CardReaderSettingsConnectedViewModelTests.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,54 @@ final class CardReaderSettingsConnectedViewModelTests: XCTestCase {
3939
wait(for: [expectation], timeout: Constants.expectationTimeout)
4040
}
4141

42+
func test_view_model_correctly_formats_connected_card_reader_battery_level() {
43+
let mockStoresManager = MockCardPresentPaymentsStoresManager(
44+
connectedReaders: [MockCardReader.bbposChipper2XBT()],
45+
discoveredReaders: [],
46+
sessionManager: SessionManager.testingInstance
47+
)
48+
ServiceLocator.setStores(mockStoresManager)
49+
50+
let viewModel = CardReaderSettingsConnectedViewModel(didChangeShouldShow: nil)
51+
XCTAssertEqual(viewModel.connectedReaderBatteryLevel, "50% Battery")
52+
}
53+
54+
func test_view_model_correctly_formats_connected_card_reader_battery_level_when_nil() {
55+
let mockStoresManager = MockCardPresentPaymentsStoresManager(
56+
connectedReaders: [MockCardReader.bbposChipper2XBTNoVerNoBatt()],
57+
discoveredReaders: [],
58+
sessionManager: SessionManager.testingInstance
59+
)
60+
ServiceLocator.setStores(mockStoresManager)
61+
62+
let viewModel = CardReaderSettingsConnectedViewModel(didChangeShouldShow: nil)
63+
XCTAssertEqual(viewModel.connectedReaderBatteryLevel, "Unknown Battery Level")
64+
}
65+
66+
func test_view_model_correctly_formats_connected_card_reader_software_version() {
67+
let mockStoresManager = MockCardPresentPaymentsStoresManager(
68+
connectedReaders: [MockCardReader.bbposChipper2XBT()],
69+
discoveredReaders: [],
70+
sessionManager: SessionManager.testingInstance
71+
)
72+
ServiceLocator.setStores(mockStoresManager)
73+
74+
let viewModel = CardReaderSettingsConnectedViewModel(didChangeShouldShow: nil)
75+
XCTAssertEqual(viewModel.connectedReaderSoftwareVersion, "Version: 1.00.03.34-SZZZ_Generic_v45-300001")
76+
}
77+
78+
func test_view_model_correctly_formats_connected_card_reader_software_version_when_nil() {
79+
let mockStoresManager = MockCardPresentPaymentsStoresManager(
80+
connectedReaders: [MockCardReader.bbposChipper2XBTNoVerNoBatt()],
81+
discoveredReaders: [],
82+
sessionManager: SessionManager.testingInstance
83+
)
84+
ServiceLocator.setStores(mockStoresManager)
85+
86+
let viewModel = CardReaderSettingsConnectedViewModel(didChangeShouldShow: nil)
87+
XCTAssertEqual(viewModel.connectedReaderSoftwareVersion, "Unknown Software Version")
88+
}
89+
4290
func test_checkForCardReaderUpdate_properly_handles_update_available() {
4391
// Given
4492
let expectation = self.expectation(description: #function)

0 commit comments

Comments
 (0)