Skip to content

Commit a97d9c5

Browse files
committed
Add cancelReconnection to properly cancel auto-reconnect
1 parent d86631d commit a97d9c5

File tree

8 files changed

+48
-3
lines changed

8 files changed

+48
-3
lines changed

WooCommerce/src/androidTest/kotlin/com/woocommerce/android/di/MockCardReaderManagerModule.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ class MockCardReaderManagerModule {
100100

101101
override fun cancelPayment(paymentData: PaymentData) {}
102102

103+
override fun cancelReconnection() {}
104+
103105
override suspend fun startAsyncSoftwareUpdate() {}
104106

105107
override suspend fun clearCachedCredentials() {}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/cardreader/WooPosCardReaderFacade.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ class WooPosCardReaderFacade @Inject constructor(
4949
cardReaderManager.disconnectReader()
5050
}
5151

52+
fun cancelReconnection() {
53+
cardReaderManager.cancelReconnection()
54+
}
55+
5256
@Suppress("DEPRECATION")
5357
private fun startActivity(intent: Intent) {
5458
val options = ActivityOptionsCompat.makeCustomAnimation(

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/woopos/home/toolbar/WooPosHomeFloatingToolbarViewModel.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,7 @@ class WooPosHomeFloatingToolbarViewModel @Inject constructor(
131131
}
132132

133133
WooPosHomeFloatingToolbarState.WooPosCardReaderStatus.Reconnecting -> {
134-
viewModelScope.launch {
135-
cardReaderFacade.disconnectFromReader()
136-
}
134+
cardReaderFacade.cancelReconnection()
137135
}
138136
}
139137
}

libs/cardreader/src/main/java/com/woocommerce/android/cardreader/CardReaderManager.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ interface CardReaderManager {
4747

4848
fun startConnectionToReader(cardReader: CardReader, locationId: String)
4949
suspend fun disconnectReader(): Boolean
50+
fun cancelReconnection()
5051

5152
suspend fun collectPayment(paymentInfo: PaymentInfo): Flow<CardPaymentStatus>
5253
suspend fun refundInteracPayment(

libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/CardReaderManagerImpl.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ internal class CardReaderManagerImpl(
103103
return connectionManager.disconnectReader()
104104
}
105105

106+
override fun cancelReconnection() {
107+
if (!terminal.isInitialized()) error("Terminal not initialized")
108+
connectionManager.cancelReconnection()
109+
}
110+
106111
override suspend fun collectPayment(paymentInfo: PaymentInfo): Flow<CardPaymentStatus> {
107112
resetBluetoothDisplayMessage()
108113
return paymentManager.acceptPayment(paymentInfo)

libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/BluetoothReaderListenerImpl.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.woocommerce.android.cardreader.internal.connection
22

3+
import com.stripe.stripeterminal.external.callable.Callback
34
import com.stripe.stripeterminal.external.callable.Cancelable
45
import com.stripe.stripeterminal.external.callable.MobileReaderListener
56
import com.stripe.stripeterminal.external.models.BatteryStatus
@@ -47,6 +48,7 @@ internal class BluetoothReaderListenerImpl(
4748
val batteryStatusEvents = _batteryStatusEvents.asStateFlow()
4849

4950
var cancelUpdateAction: Cancelable? = null
51+
var cancelReconnectAction: Cancelable? = null
5052

5153
override fun onFinishInstallingUpdate(update: ReaderSoftwareUpdate?, e: TerminalException?) {
5254
logWrapper.d(LOG_TAG, "onFinishInstallingUpdate: $update $e")
@@ -121,6 +123,7 @@ internal class BluetoothReaderListenerImpl(
121123

122124
override fun onReaderReconnectFailed(reader: Reader) {
123125
logWrapper.d(LOG_TAG, "onReaderReconnectFailed")
126+
cancelReconnectAction = null
124127
terminalListenerImpl.updateReaderStatus(CardReaderStatus.NotConnected())
125128
}
126129

@@ -130,11 +133,13 @@ internal class BluetoothReaderListenerImpl(
130133
reason: DisconnectReason
131134
) {
132135
logWrapper.d(LOG_TAG, "onReaderReconnectStarted: reason=$reason")
136+
cancelReconnectAction = cancelReconnect
133137
terminalListenerImpl.updateReaderStatus(CardReaderStatus.Reconnecting)
134138
}
135139

136140
override fun onReaderReconnectSucceeded(reader: Reader) {
137141
logWrapper.d(LOG_TAG, "onReaderReconnectSucceeded")
142+
cancelReconnectAction = null
138143
terminalListenerImpl.updateReaderStatus(CardReaderStatus.Connected(CardReaderImpl(reader)))
139144
}
140145

@@ -146,4 +151,9 @@ internal class BluetoothReaderListenerImpl(
146151
fun resetDisplayMessage() {
147152
_displayMessagesEvents.value = CardReaderNoMessage
148153
}
154+
155+
fun cancelReconnection(callback: Callback) {
156+
cancelReconnectAction?.cancel(callback)
157+
cancelReconnectAction = null
158+
}
149159
}

libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManager.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,20 @@ internal class ConnectionManager(
163163
})
164164
}
165165

166+
fun cancelReconnection() {
167+
val callback = object : Callback {
168+
override fun onFailure(e: TerminalException) {
169+
updateReaderStatus(CardReaderStatus.NotConnected())
170+
}
171+
172+
override fun onSuccess() {
173+
updateReaderStatus(CardReaderStatus.NotConnected())
174+
}
175+
}
176+
bluetoothReaderListener.cancelReconnection(callback)
177+
tapToPayReaderListener.cancelReconnection(callback)
178+
}
179+
166180
private fun startStateResettingJobIfNeeded(currentStatus: CardReaderStatus) {
167181
if (currentStatus !is CardReaderStatus.Connecting) return
168182

libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/TapToPayReaderListenerImpl.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.woocommerce.android.cardreader.internal.connection
22

3+
import com.stripe.stripeterminal.external.callable.Callback
34
import com.stripe.stripeterminal.external.callable.Cancelable
45
import com.stripe.stripeterminal.external.callable.TapToPayReaderListener
56
import com.stripe.stripeterminal.external.models.DisconnectReason
@@ -13,13 +14,16 @@ internal class TapToPayReaderListenerImpl(
1314
private val logWrapper: LogWrapper,
1415
private val terminalListenerImpl: TerminalListenerImpl
1516
) : TapToPayReaderListener {
17+
var cancelReconnectAction: Cancelable? = null
18+
1619
override fun onDisconnect(reason: DisconnectReason) {
1720
logWrapper.d(LOG_TAG, "onDisconnect: reason=$reason")
1821
terminalListenerImpl.updateReaderStatus(CardReaderStatus.NotConnected())
1922
}
2023

2124
override fun onReaderReconnectFailed(reader: Reader) {
2225
logWrapper.d(LOG_TAG, "onReaderReconnectFailed")
26+
cancelReconnectAction = null
2327
terminalListenerImpl.updateReaderStatus(CardReaderStatus.NotConnected())
2428
}
2529

@@ -29,11 +33,18 @@ internal class TapToPayReaderListenerImpl(
2933
reason: DisconnectReason
3034
) {
3135
logWrapper.d(LOG_TAG, "onReaderReconnectStarted: reason=$reason")
36+
cancelReconnectAction = cancelReconnect
3237
terminalListenerImpl.updateReaderStatus(CardReaderStatus.Reconnecting)
3338
}
3439

3540
override fun onReaderReconnectSucceeded(reader: Reader) {
3641
logWrapper.d(LOG_TAG, "onReaderReconnectSucceeded")
42+
cancelReconnectAction = null
3743
terminalListenerImpl.updateReaderStatus(CardReaderStatus.Connected(CardReaderImpl(reader)))
3844
}
45+
46+
fun cancelReconnection(callback: Callback) {
47+
cancelReconnectAction?.cancel(callback)
48+
cancelReconnectAction = null
49+
}
3950
}

0 commit comments

Comments
 (0)