diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/di/MockCardReaderManagerModule.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/di/MockCardReaderManagerModule.kt index ae9a6b199af..3190295e9a4 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/di/MockCardReaderManagerModule.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/di/MockCardReaderManagerModule.kt @@ -42,7 +42,7 @@ class MockCardReaderManagerModule { override val id: String get() = "ADEE123" override val type: String - get() = "COTS_DEVICE" + get() = "TAP_TO_PAY_DEVICE" override val currentBatteryLevel: Float get() = 1f override val firmwareVersion: String diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/WooCommerce.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/WooCommerce.kt index f7226a6e3aa..82dbb9f09f5 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/WooCommerce.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/WooCommerce.kt @@ -28,7 +28,7 @@ open class WooCommerce : Application(), HasAndroidInjector, Configuration.Provid // Stripe Tap to Pay library starts it's own process. That causes the crash: // > Caused by: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process - // > com.woocommerce.android:stripelocalmobile Make sure to call FirebaseApp.initializeApp(Context) first. + // > com.woocommerce.android:stripetaptopay Make sure to call FirebaseApp.initializeApp(Context) first. // In this case we don't want to initialize any Firebase (or any at all) features of the app in their process. if (getCurrentProcessName() == "${BuildConfig.APPLICATION_ID}:$TAP_TO_PAY_STRIPE_PROCESS_NAME_SUFFIX") return @@ -55,6 +55,6 @@ open class WooCommerce : Application(), HasAndroidInjector, Configuration.Provid override fun androidInjector(): AndroidInjector = androidInjector companion object { - private const val TAP_TO_PAY_STRIPE_PROCESS_NAME_SUFFIX = "stripelocalmobile" + private const val TAP_TO_PAY_STRIPE_PROCESS_NAME_SUFFIX = "stripetaptopay" } } diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModel.kt index 91e063f6863..b4cdcd9840d 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModel.kt @@ -17,7 +17,7 @@ import com.woocommerce.android.cardreader.connection.CardReaderDiscoveryEvents.S import com.woocommerce.android.cardreader.connection.CardReaderStatus import com.woocommerce.android.cardreader.connection.CardReaderTypesToDiscover.SpecificReaders.BuiltInReaders import com.woocommerce.android.cardreader.connection.CardReaderTypesToDiscover.SpecificReaders.ExternalReaders -import com.woocommerce.android.cardreader.connection.ReaderType.BuildInReader.CotsDevice +import com.woocommerce.android.cardreader.connection.ReaderType.BuildInReader.TapToPayDevice import com.woocommerce.android.cardreader.connection.ReaderType.ExternalReader.Chipper2X import com.woocommerce.android.cardreader.connection.ReaderType.ExternalReader.StripeM2 import com.woocommerce.android.cardreader.connection.ReaderType.ExternalReader.WisePade3 @@ -578,7 +578,7 @@ class CardReaderConnectViewModel @Inject constructor( private fun buildReadersToDiscover() = when (arguments.cardReaderType) { - BUILT_IN -> BuiltInReaders(listOf(CotsDevice)) + BUILT_IN -> BuiltInReaders(listOf(TapToPayDevice)) EXTERNAL -> ExternalReaders( listOf( Chipper2X, diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/manuals/CardReaderManualsSupportedReadersMapper.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/manuals/CardReaderManualsSupportedReadersMapper.kt index afda4db6e45..8bc13d0a785 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/manuals/CardReaderManualsSupportedReadersMapper.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/payments/cardreader/manuals/CardReaderManualsSupportedReadersMapper.kt @@ -4,7 +4,7 @@ import com.woocommerce.android.R.drawable import com.woocommerce.android.R.string import com.woocommerce.android.cardreader.config.CardReaderConfigForSupportedCountry import com.woocommerce.android.cardreader.connection.ReaderType -import com.woocommerce.android.cardreader.connection.ReaderType.BuildInReader.CotsDevice +import com.woocommerce.android.cardreader.connection.ReaderType.BuildInReader.TapToPayDevice import com.woocommerce.android.cardreader.connection.ReaderType.ExternalReader.Chipper2X import com.woocommerce.android.cardreader.connection.ReaderType.ExternalReader.StripeM2 import com.woocommerce.android.cardreader.connection.ReaderType.ExternalReader.WisePade3 @@ -34,7 +34,7 @@ class CardReaderManualsSupportedReadersMapper @Inject constructor() { label = string.card_reader_wisepad_3_manual_card_reader, onManualClicked = clickListeners[it]!! ) - CotsDevice -> null // This is built-in reader, we don't need to show it in the list + TapToPayDevice -> null // This is built-in reader, we don't need to show it in the list else -> error("$it doesn't have a manual") } } diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModelTest.kt index f79fa04de66..62f03bc63c0 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/connect/CardReaderConnectViewModelTest.kt @@ -1534,7 +1534,7 @@ class CardReaderConnectViewModelTest : BaseUnitTest() { verify(cardReaderManager).discoverReaders(anyBoolean(), captor.capture()) assertThat(captor.firstValue).isEqualTo( CardReaderTypesToDiscover.SpecificReaders.BuiltInReaders( - listOf(ReaderType.BuildInReader.CotsDevice) + listOf(ReaderType.BuildInReader.TapToPayDevice) ) ) } diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/detail/CardReaderDetailViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/detail/CardReaderDetailViewModelTest.kt index ad60c32081e..ae04d3e00d0 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/detail/CardReaderDetailViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/detail/CardReaderDetailViewModelTest.kt @@ -107,7 +107,7 @@ class CardReaderDetailViewModelTest : BaseUnitTest() { testBlocking { // GIVEN initConnectedState( - readerType = ReaderType.BuildInReader.CotsDevice + readerType = ReaderType.BuildInReader.TapToPayDevice ) // WHEN @@ -123,7 +123,7 @@ class CardReaderDetailViewModelTest : BaseUnitTest() { testBlocking { // GIVEN initConnectedState( - readerType = ReaderType.BuildInReader.CotsDevice + readerType = ReaderType.BuildInReader.TapToPayDevice ) // WHEN diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/controller/CardReaderPaymentControllerTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/controller/CardReaderPaymentControllerTest.kt index 47272676dff..cabdb93c95c 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/controller/CardReaderPaymentControllerTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/payment/controller/CardReaderPaymentControllerTest.kt @@ -2394,7 +2394,7 @@ class CardReaderPaymentControllerTest : BaseUnitTest() { fun `given built in payment failed state and connected BI, when user presses back, then disconnect from reader invoked`() = testBlocking { val cardReader: CardReader = mock { - on { type }.thenReturn("COTS_DEVICE") + on { type }.thenReturn("TAP_TO_PAY_DEVICE") } whenever(cardReaderManager.readerStatus).thenReturn( MutableStateFlow(CardReaderStatus.Connected(cardReader)) @@ -3492,7 +3492,7 @@ class CardReaderPaymentControllerTest : BaseUnitTest() { testBlocking { setupControllerForInteracRefund() val cardReader: CardReader = mock { - on { type }.thenReturn("COTS_DEVICE") + on { type }.thenReturn("TAP_TO_PAY_DEVICE") } whenever(cardReaderManager.readerStatus).thenReturn( MutableStateFlow(CardReaderStatus.Connected(cardReader)) diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/statuschecker/CardReaderStatusCheckerViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/statuschecker/CardReaderStatusCheckerViewModelTest.kt index 722934d20f2..2df528dda14 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/statuschecker/CardReaderStatusCheckerViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/payments/cardreader/statuschecker/CardReaderStatusCheckerViewModelTest.kt @@ -207,7 +207,7 @@ class CardReaderStatusCheckerViewModelTest : BaseUnitTest() { val orderId = 1L val param = CardReaderFlowParam.PaymentOrRefund.Payment(orderId = orderId, paymentType = ORDER) val connectedReader: CardReader = mock { - on { type }.thenReturn(ReaderType.BuildInReader.CotsDevice.name) + on { type }.thenReturn(ReaderType.BuildInReader.TapToPayDevice.name) } whenever(appPrefsWrapper.isCardReaderWelcomeDialogShown()).thenReturn(true) whenever(cardReaderManager.readerStatus).thenReturn( @@ -300,13 +300,13 @@ class CardReaderStatusCheckerViewModelTest : BaseUnitTest() { } @Test - fun `given payment flow and connected COTS reader, when vm init, then navigates to payment with built in`() = + fun `given payment flow and connected Tap To Pay reader, when vm init, then navigates to payment with built in`() = testBlocking { // GIVEN val orderId = 1L val param = CardReaderFlowParam.PaymentOrRefund.Payment(orderId = orderId, paymentType = ORDER) val connectedReader: CardReader = mock { - on { type }.thenReturn(ReaderType.BuildInReader.CotsDevice.name) + on { type }.thenReturn(ReaderType.BuildInReader.TapToPayDevice.name) } whenever(cardReaderManager.readerStatus).thenReturn( MutableStateFlow( diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8a65f6b9d20..ca0f888ca02 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -92,7 +92,7 @@ sentry = '4.10.0' squareup-javapoet = "1.7.0" squareup-leakcanary = '2.14' squareup-okhttp3 = "4.9.0" -stripe-terminal = '3.7.1' +stripe-terminal = '4.3.1' terl-lazysodium-android = '5.0.2@aar' tinder-statemachine = '0.2.0' volley = "1.1.1" @@ -255,7 +255,7 @@ squareup-javapoet = { module = "com.squareup:javapoet", version.ref = "squareup- squareup-leakcanary-android = { group = "com.squareup.leakcanary", name = "leakcanary-android", version.ref = "squareup-leakcanary" } squareup-okhttp3 = { module = "com.squareup.okhttp3:okhttp", version.ref = "squareup-okhttp3" } squareup-okhttp3-urlconnection = { module = "com.squareup.okhttp3:okhttp-urlconnection", version.ref = "squareup-okhttp3" } -stripe-terminal-localmobile = { group = "com.stripe", name = "stripeterminal-localmobile", version.ref = "stripe-terminal" } +stripe-terminal-taptopay = { group = "com.stripe", name = "stripeterminal-taptopay", version.ref = "stripe-terminal" } stripe-terminal-core = { group = "com.stripe", name = "stripeterminal-core", version.ref = "stripe-terminal" } terl-lazysodium-android = { module = "com.goterl:lazysodium-android", version.ref = "terl-lazysodium-android" } tinder-statemachine = { group = "com.tinder.statemachine", name = "statemachine", version.ref = "tinder-statemachine" } diff --git a/libs/cardreader/build.gradle b/libs/cardreader/build.gradle index 342f580cc6c..ad42c0e416c 100644 --- a/libs/cardreader/build.gradle +++ b/libs/cardreader/build.gradle @@ -28,7 +28,7 @@ android { } dependencies { - implementation(libs.stripe.terminal.localmobile) + implementation(libs.stripe.terminal.taptopay) implementation(libs.stripe.terminal.core) // Coroutines diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/CardReaderManagerFactory.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/CardReaderManagerFactory.kt index ebc80fa35d8..0d1c1ba60f2 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/CardReaderManagerFactory.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/CardReaderManagerFactory.kt @@ -6,6 +6,7 @@ import com.woocommerce.android.cardreader.internal.CardReaderManagerImpl import com.woocommerce.android.cardreader.internal.TokenProvider import com.woocommerce.android.cardreader.internal.connection.BluetoothReaderListenerImpl import com.woocommerce.android.cardreader.internal.connection.ConnectionManager +import com.woocommerce.android.cardreader.internal.connection.TapToPayReaderListenerImpl import com.woocommerce.android.cardreader.internal.connection.TerminalListenerImpl import com.woocommerce.android.cardreader.internal.connection.UpdateErrorMapper import com.woocommerce.android.cardreader.internal.connection.actions.DiscoverReadersAction @@ -39,6 +40,7 @@ object CardReaderManagerFactory { AdditionalInfoMapper(), UpdateErrorMapper(batteryLevelProvider) ) + val tapToPayReaderListener = TapToPayReaderListenerImpl(logWrapper) val terminalListener = TerminalListenerImpl(logWrapper) val cardReaderConfigFactory = CardReaderConfigFactory() val paymentUtils = PaymentUtils(logWrapper) @@ -74,6 +76,7 @@ object CardReaderManagerFactory { ConnectionManager( terminal, bluetoothReaderListener, + tapToPayReaderListener, DiscoverReadersAction(terminal, logWrapper), terminalListener, application, diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/config/CardReaderConfigForCanada.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/config/CardReaderConfigForCanada.kt index 9737f483b8f..29e6cc16979 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/config/CardReaderConfigForCanada.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/config/CardReaderConfigForCanada.kt @@ -11,7 +11,7 @@ object CardReaderConfigForCanada : CardReaderConfigForSupportedCountry( countryCode = "CA", supportedReaders = listOf( ReaderType.ExternalReader.WisePade3, - ReaderType.BuildInReader.CotsDevice, + ReaderType.BuildInReader.TapToPayDevice, ), paymentMethodTypes = listOf( PaymentMethodType.CARD_PRESENT, diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/config/CardReaderConfigForGB.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/config/CardReaderConfigForGB.kt index d258fbcb0f6..034c38911d7 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/config/CardReaderConfigForGB.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/config/CardReaderConfigForGB.kt @@ -11,7 +11,7 @@ object CardReaderConfigForGB : CardReaderConfigForSupportedCountry( countryCode = "GB", supportedReaders = listOf( ReaderType.ExternalReader.WisePade3, - ReaderType.BuildInReader.CotsDevice, + ReaderType.BuildInReader.TapToPayDevice, ), paymentMethodTypes = listOf(PaymentMethodType.CARD_PRESENT), supportedExtensions = listOf( diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/config/CardReaderConfigForUSA.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/config/CardReaderConfigForUSA.kt index c84274db1cd..f9f26467cb8 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/config/CardReaderConfigForUSA.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/config/CardReaderConfigForUSA.kt @@ -12,7 +12,7 @@ object CardReaderConfigForUSA : CardReaderConfigForSupportedCountry( supportedReaders = listOf( ReaderType.ExternalReader.Chipper2X, ReaderType.ExternalReader.StripeM2, - ReaderType.BuildInReader.CotsDevice, + ReaderType.BuildInReader.TapToPayDevice, ), paymentMethodTypes = listOf(PaymentMethodType.CARD_PRESENT), supportedExtensions = listOf( diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/connection/CardReaderType.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/connection/CardReaderType.kt index a0a8e9baeca..fe3ac8fd2b1 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/connection/CardReaderType.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/connection/CardReaderType.kt @@ -13,7 +13,7 @@ sealed class ReaderType(val name: String) { } sealed class BuildInReader(buildInReaderName: String) : ReaderType(buildInReaderName) { - object CotsDevice : BuildInReader("COTS_DEVICE") + object TapToPayDevice : BuildInReader("TAP_TO_PAY_DEVICE") } object Unknown : ReaderType("UNKNOWN") @@ -26,7 +26,7 @@ sealed class ReaderType(val name: String) { "VERIFONE_P400" -> ExternalReader.VerifoneP400 "WISEPAD_3" -> ExternalReader.WisePade3 "WISEPOS_E" -> ExternalReader.WisePadeE - "COTS_DEVICE" -> BuildInReader.CotsDevice + "TAP_TO_PAY_DEVICE" -> BuildInReader.TapToPayDevice else -> Unknown } diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/BluetoothReaderListenerImpl.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/BluetoothReaderListenerImpl.kt index 9d5819ce1bc..bb3aaf874fc 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/BluetoothReaderListenerImpl.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/BluetoothReaderListenerImpl.kt @@ -1,8 +1,9 @@ package com.woocommerce.android.cardreader.internal.connection import com.stripe.stripeterminal.external.callable.Cancelable -import com.stripe.stripeterminal.external.callable.ReaderListener +import com.stripe.stripeterminal.external.callable.MobileReaderListener import com.stripe.stripeterminal.external.models.BatteryStatus +import com.stripe.stripeterminal.external.models.DisconnectReason import com.stripe.stripeterminal.external.models.ReaderDisplayMessage import com.stripe.stripeterminal.external.models.ReaderEvent import com.stripe.stripeterminal.external.models.ReaderInputOptions @@ -27,7 +28,7 @@ internal class BluetoothReaderListenerImpl( private val logWrapper: LogWrapper, private val additionalInfoMapper: AdditionalInfoMapper, private val updateErrorMapper: UpdateErrorMapper, -) : ReaderListener { +) : MobileReaderListener { private val _updateStatusEvents = MutableStateFlow(SoftwareUpdateStatus.Unknown) val updateStatusEvents = _updateStatusEvents.asStateFlow() @@ -104,6 +105,10 @@ internal class BluetoothReaderListenerImpl( _displayMessagesEvents.value = BluetoothCardReaderMessages.CardReaderInputMessage(options.toString()) } + override fun onDisconnect(reason: DisconnectReason) { + logWrapper.d(LOG_TAG, "onDisconnect") + } + fun resetConnectionState() { _updateStatusEvents.value = SoftwareUpdateStatus.Unknown _updateAvailabilityEvents.value = SoftwareUpdateAvailability.NotAvailable diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManager.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManager.kt index 5cb456679ad..cd117134c2b 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManager.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManager.kt @@ -7,9 +7,10 @@ import android.os.Build import com.stripe.stripeterminal.external.callable.Callback import com.stripe.stripeterminal.external.callable.ReaderCallback import com.stripe.stripeterminal.external.models.ConnectionConfiguration.BluetoothConnectionConfiguration -import com.stripe.stripeterminal.external.models.ConnectionConfiguration.LocalMobileConnectionConfiguration +import com.stripe.stripeterminal.external.models.ConnectionConfiguration.TapToPayConnectionConfiguration import com.stripe.stripeterminal.external.models.DeviceType import com.stripe.stripeterminal.external.models.Reader +import com.stripe.stripeterminal.external.models.TerminalErrorCode import com.stripe.stripeterminal.external.models.TerminalException import com.woocommerce.android.cardreader.connection.CardReader import com.woocommerce.android.cardreader.connection.CardReaderDiscoveryEvents @@ -38,6 +39,7 @@ private const val ARTIFICIAL_STATUS_UPDATE_DELAY_IN_MILLIS = 500L internal class ConnectionManager( private val terminal: TerminalWrapper, private val bluetoothReaderListener: BluetoothReaderListenerImpl, + private val tapToPayReaderListener: TapToPayReaderListenerImpl, private val discoverReadersAction: DiscoverReadersAction, private val terminalListenerImpl: TerminalListenerImpl, private val application: Application, @@ -140,7 +142,7 @@ internal class ConnectionManager( } when (it.cardReader.deviceType) { - DeviceType.COTS_DEVICE -> connectToBuiltInReader(cardReader, locationId, readerCallback) + DeviceType.TAP_TO_PAY_DEVICE -> connectToBuiltInReader(cardReader, locationId, readerCallback) else -> connectToExternalReader(cardReader, locationId, readerCallback) } } @@ -199,9 +201,8 @@ internal class ConnectionManager( ) { terminal.connectToReader( cardReader.cardReader, - BluetoothConnectionConfiguration(locationId), - readerCallback, - bluetoothReaderListener, + BluetoothConnectionConfiguration(locationId, true, bluetoothReaderListener), + readerCallback ) } @@ -212,14 +213,18 @@ internal class ConnectionManager( ) { terminal.connectToMobile( cardReader.cardReader, - LocalMobileConnectionConfiguration(locationId), + TapToPayConnectionConfiguration( + locationId, + autoReconnectOnUnexpectedDisconnect = true, + tapToPayReaderListener + ), readerCallback ) } - private fun TerminalException.TerminalErrorCode.toErrorCode(): CardReaderStatus.NotConnected.ErrorCode = + private fun TerminalErrorCode.toErrorCode(): CardReaderStatus.NotConnected.ErrorCode = when (this) { - TerminalException.TerminalErrorCode.READER_BATTERY_CRITICALLY_LOW -> + TerminalErrorCode.READER_BATTERY_CRITICALLY_LOW -> CardReaderStatus.NotConnected.ErrorCode.BATTERY_CRITICALLY_LOW else -> CardReaderStatus.NotConnected.ErrorCode.OTHER diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/TapToPayReaderListenerImpl.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/TapToPayReaderListenerImpl.kt new file mode 100644 index 00000000000..b5d08f4d613 --- /dev/null +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/TapToPayReaderListenerImpl.kt @@ -0,0 +1,32 @@ +package com.woocommerce.android.cardreader.internal.connection + +import com.stripe.stripeterminal.external.callable.Cancelable +import com.stripe.stripeterminal.external.callable.TapToPayReaderListener +import com.stripe.stripeterminal.external.models.DisconnectReason +import com.stripe.stripeterminal.external.models.Reader +import com.woocommerce.android.cardreader.LogWrapper +import com.woocommerce.android.cardreader.internal.LOG_TAG + +class TapToPayReaderListenerImpl( + private val logWrapper: LogWrapper +) : TapToPayReaderListener { + override fun onDisconnect(reason: DisconnectReason) { + logWrapper.d(LOG_TAG, "onDisconnect") + } + + override fun onReaderReconnectFailed(reader: Reader) { + logWrapper.d(LOG_TAG, "onReaderReconnectFailed") + } + + override fun onReaderReconnectStarted( + reader: Reader, + cancelReconnect: Cancelable, + reason: DisconnectReason + ) { + logWrapper.d(LOG_TAG, "onReaderReconnectStarted") + } + + override fun onReaderReconnectSucceeded(reader: Reader) { + logWrapper.d(LOG_TAG, "onReaderReconnectSucceeded") + } +} diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/TerminalListenerImpl.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/TerminalListenerImpl.kt index b1d4c2cbfa6..57139c8ad1b 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/TerminalListenerImpl.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/TerminalListenerImpl.kt @@ -3,7 +3,6 @@ package com.woocommerce.android.cardreader.internal.connection import com.stripe.stripeterminal.external.callable.TerminalListener import com.stripe.stripeterminal.external.models.ConnectionStatus import com.stripe.stripeterminal.external.models.PaymentStatus -import com.stripe.stripeterminal.external.models.Reader import com.woocommerce.android.cardreader.LogWrapper import com.woocommerce.android.cardreader.connection.CardReaderStatus import com.woocommerce.android.cardreader.internal.LOG_TAG @@ -20,13 +19,12 @@ internal class TerminalListenerImpl( _readerStatus.value = newStatus } - override fun onUnexpectedReaderDisconnect(reader: Reader) { - _readerStatus.value = CardReaderStatus.NotConnected() - logWrapper.d(LOG_TAG, "onUnexpectedReaderDisconnect") - } - override fun onConnectionStatusChange(status: ConnectionStatus) { logWrapper.d(LOG_TAG, "onConnectionStatusChange: ${status.name}") + + if (status == ConnectionStatus.NOT_CONNECTED) { + _readerStatus.value = CardReaderStatus.NotConnected() + } } override fun onPaymentStatusChange(status: PaymentStatus) { diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/UpdateErrorMapper.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/UpdateErrorMapper.kt index af5bb767e8f..0ba4b76b825 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/UpdateErrorMapper.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/UpdateErrorMapper.kt @@ -1,18 +1,18 @@ package com.woocommerce.android.cardreader.internal.connection -import com.stripe.stripeterminal.external.models.TerminalException +import com.stripe.stripeterminal.external.models.TerminalErrorCode import com.woocommerce.android.cardreader.connection.event.SoftwareUpdateStatusErrorType internal class UpdateErrorMapper(private val batteryLevelProvider: () -> Float?) { - fun map(error: TerminalException.TerminalErrorCode): SoftwareUpdateStatusErrorType = + fun map(error: TerminalErrorCode): SoftwareUpdateStatusErrorType = when (error) { - TerminalException.TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_BATTERY_LOW -> + TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_BATTERY_LOW -> SoftwareUpdateStatusErrorType.BatteryLow(batteryLevelProvider.invoke()) - TerminalException.TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_INTERRUPTED -> + TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_INTERRUPTED -> SoftwareUpdateStatusErrorType.Interrupted - TerminalException.TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_READER_ERROR -> + TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_READER_ERROR -> SoftwareUpdateStatusErrorType.ReaderError - TerminalException.TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_SERVER_ERROR -> + TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_SERVER_ERROR -> SoftwareUpdateStatusErrorType.ServerError else -> SoftwareUpdateStatusErrorType.Failed } diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/actions/DiscoverReadersAction.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/actions/DiscoverReadersAction.kt index a1efa823727..6ba25cada2d 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/actions/DiscoverReadersAction.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/connection/actions/DiscoverReadersAction.kt @@ -34,7 +34,7 @@ internal class DiscoverReadersAction( value = "android.permission.ACCESS_FINE_LOCATION", ) fun discoverBuildInReaders(isSimulated: Boolean): Flow = - discoverReaders(DiscoveryConfiguration.LocalMobileDiscoveryConfiguration(isSimulated)) + discoverReaders(DiscoveryConfiguration.TapToPayDiscoveryConfiguration(isSimulated)) @RequiresPermission( allOf = [ diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/payments/PaymentErrorMapper.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/payments/PaymentErrorMapper.kt index da54c0cfd4e..4b6bd13590f 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/payments/PaymentErrorMapper.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/payments/PaymentErrorMapper.kt @@ -1,8 +1,8 @@ package com.woocommerce.android.cardreader.internal.payments import com.stripe.stripeterminal.external.models.PaymentIntent +import com.stripe.stripeterminal.external.models.TerminalErrorCode import com.stripe.stripeterminal.external.models.TerminalException -import com.stripe.stripeterminal.external.models.TerminalException.TerminalErrorCode import com.woocommerce.android.cardreader.CardReaderStore.CapturePaymentResponse import com.woocommerce.android.cardreader.CardReaderStore.CapturePaymentResponse.Error.NetworkError import com.woocommerce.android.cardreader.CardReaderStore.CapturePaymentResponse.Error.ServerError @@ -47,11 +47,11 @@ internal class PaymentErrorMapper { TerminalErrorCode.CARD_READ_TIMED_OUT -> CardReadTimeOut TerminalErrorCode.DECLINED_BY_STRIPE_API -> mapDeclinedByStripeApiError(exception) TerminalErrorCode.REQUEST_TIMED_OUT -> NoNetwork - TerminalErrorCode.LOCAL_MOBILE_NFC_DISABLED -> NfcDisabled - TerminalErrorCode.LOCAL_MOBILE_UNSUPPORTED_DEVICE, - TerminalErrorCode.LOCAL_MOBILE_DEVICE_TAMPERED, - TerminalErrorCode.LOCAL_MOBILE_UNSUPPORTED_ANDROID_VERSION -> DeviceIsNotSupported - TerminalErrorCode.LOCAL_MOBILE_LIBRARY_NOT_INCLUDED -> InvalidAppSetup + TerminalErrorCode.TAP_TO_PAY_NFC_DISABLED -> NfcDisabled + TerminalErrorCode.TAP_TO_PAY_UNSUPPORTED_DEVICE, + TerminalErrorCode.TAP_TO_PAY_DEVICE_TAMPERED, + TerminalErrorCode.TAP_TO_PAY_UNSUPPORTED_ANDROID_VERSION -> DeviceIsNotSupported + TerminalErrorCode.TAP_TO_PAY_LIBRARY_NOT_INCLUDED -> InvalidAppSetup TerminalErrorCode.CANCELED -> Canceled else -> Generic } diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/payments/RefundErrorMapper.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/payments/RefundErrorMapper.kt index d8a468ab10c..2eba9068029 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/payments/RefundErrorMapper.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/payments/RefundErrorMapper.kt @@ -1,5 +1,6 @@ package com.woocommerce.android.cardreader.internal.payments +import com.stripe.stripeterminal.external.models.TerminalErrorCode import com.stripe.stripeterminal.external.models.TerminalException import com.woocommerce.android.cardreader.payments.CardInteracRefundStatus.InteracRefundFailure import com.woocommerce.android.cardreader.payments.CardInteracRefundStatus.RefundStatusErrorType.Cancelled @@ -14,9 +15,9 @@ internal class RefundErrorMapper { exception: TerminalException ): InteracRefundFailure { val type = when (exception.errorCode) { - TerminalException.TerminalErrorCode.DECLINED_BY_STRIPE_API -> mapDeclinedByStripeApiError(exception) - TerminalException.TerminalErrorCode.STRIPE_API_CONNECTION_ERROR -> NoNetwork - TerminalException.TerminalErrorCode.CANCELED -> Cancelled + TerminalErrorCode.DECLINED_BY_STRIPE_API -> mapDeclinedByStripeApiError(exception) + TerminalErrorCode.STRIPE_API_CONNECTION_ERROR -> NoNetwork + TerminalErrorCode.CANCELED -> Cancelled else -> Generic } return InteracRefundFailure(type, exception.errorMessage, refundParams) diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/payments/actions/ProcessPaymentAction.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/payments/actions/ProcessPaymentAction.kt index c042652c406..4bbcb5e3405 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/payments/actions/ProcessPaymentAction.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/payments/actions/ProcessPaymentAction.kt @@ -1,5 +1,6 @@ package com.woocommerce.android.cardreader.internal.payments.actions +import com.stripe.stripeterminal.external.callable.Callback import com.stripe.stripeterminal.external.callable.PaymentIntentCallback import com.stripe.stripeterminal.external.models.PaymentIntent import com.stripe.stripeterminal.external.models.TerminalException @@ -21,7 +22,7 @@ internal class ProcessPaymentAction(private val terminal: TerminalWrapper, priva fun processPayment(paymentIntent: PaymentIntent): Flow { return callbackFlow { - terminal.processPayment( + val cancelable = terminal.processPayment( paymentIntent, object : PaymentIntentCallback { override fun onSuccess(paymentIntent: PaymentIntent) { @@ -41,7 +42,19 @@ internal class ProcessPaymentAction(private val terminal: TerminalWrapper, priva } } ) - awaitClose() + awaitClose { + if (!cancelable.isCompleted) cancelable.cancel(noop) + } } } } + +private val noop = object : Callback { + override fun onFailure(e: TerminalException) { + // noop + } + + override fun onSuccess() { + // noop + } +} diff --git a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/wrappers/TerminalWrapper.kt b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/wrappers/TerminalWrapper.kt index 96c138f7a70..429e8cb35c5 100644 --- a/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/wrappers/TerminalWrapper.kt +++ b/libs/cardreader/src/main/java/com/woocommerce/android/cardreader/internal/wrappers/TerminalWrapper.kt @@ -9,7 +9,6 @@ import com.stripe.stripeterminal.external.callable.ConnectionTokenProvider import com.stripe.stripeterminal.external.callable.DiscoveryListener import com.stripe.stripeterminal.external.callable.PaymentIntentCallback import com.stripe.stripeterminal.external.callable.ReaderCallback -import com.stripe.stripeterminal.external.callable.ReaderListener import com.stripe.stripeterminal.external.callable.RefundCallback import com.stripe.stripeterminal.external.callable.TerminalListener import com.stripe.stripeterminal.external.models.ConnectionConfiguration @@ -56,15 +55,14 @@ internal class TerminalWrapper { fun connectToReader( reader: Reader, configuration: ConnectionConfiguration.BluetoothConnectionConfiguration, - callback: ReaderCallback, - listener: ReaderListener - ) = Terminal.getInstance().connectBluetoothReader(reader, configuration, listener, callback) + callback: ReaderCallback + ) = Terminal.getInstance().connectReader(reader, configuration, callback) fun connectToMobile( reader: Reader, - configuration: ConnectionConfiguration.LocalMobileConnectionConfiguration, + configuration: ConnectionConfiguration.TapToPayConnectionConfiguration, callback: ReaderCallback - ) = Terminal.getInstance().connectLocalMobileReader(reader, configuration, callback) + ) = Terminal.getInstance().connectReader(reader, configuration, callback) fun disconnectReader(callback: Callback) = Terminal.getInstance().disconnectReader(callback) @@ -79,7 +77,7 @@ internal class TerminalWrapper { callback: PaymentIntentCallback ): Cancelable = Terminal.getInstance().collectPaymentMethod(paymentIntent, callback) - fun processPayment(paymentIntent: PaymentIntent, callback: PaymentIntentCallback) = + fun processPayment(paymentIntent: PaymentIntent, callback: PaymentIntentCallback): Cancelable = Terminal.getInstance().confirmPaymentIntent(paymentIntent, callback) fun cancelPayment(paymentIntent: PaymentIntent, callback: PaymentIntentCallback) = diff --git a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/BluetoothReaderListenerImplTest.kt b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/BluetoothReaderListenerImplTest.kt index d19382e0477..c59573ec9b8 100644 --- a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/BluetoothReaderListenerImplTest.kt +++ b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/BluetoothReaderListenerImplTest.kt @@ -2,6 +2,7 @@ package com.woocommerce.android.cardreader.internal.connection import com.stripe.stripeterminal.external.models.ReaderDisplayMessage import com.stripe.stripeterminal.external.models.ReaderInputOptions +import com.stripe.stripeterminal.external.models.TerminalErrorCode import com.stripe.stripeterminal.external.models.TerminalException import com.woocommerce.android.cardreader.LogWrapper import com.woocommerce.android.cardreader.connection.event.BatteryStatus.CRITICAL @@ -35,9 +36,9 @@ class BluetoothReaderListenerImplTest { val errorType: SoftwareUpdateStatusErrorType = SoftwareUpdateStatusErrorType.Failed val exception = mock { on { message }.thenReturn(expectedMessage) - on { errorCode }.thenReturn(TerminalException.TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED) + on { errorCode }.thenReturn(TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED) } - whenever(updateErrorMapper.map(TerminalException.TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED)) + whenever(updateErrorMapper.map(TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED)) .thenReturn(errorType) // WHEN diff --git a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManagerTest.kt b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManagerTest.kt index cdb34edc8c5..b42df8cd02b 100644 --- a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManagerTest.kt +++ b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/ConnectionManagerTest.kt @@ -5,6 +5,7 @@ import com.stripe.stripeterminal.external.callable.Callback import com.stripe.stripeterminal.external.callable.ReaderCallback import com.stripe.stripeterminal.external.models.DeviceType import com.stripe.stripeterminal.external.models.Reader +import com.stripe.stripeterminal.external.models.TerminalErrorCode import com.stripe.stripeterminal.external.models.TerminalException import com.woocommerce.android.cardreader.connection.CardReaderDiscoveryEvents import com.woocommerce.android.cardreader.connection.CardReaderDiscoveryEvents.ReadersFound @@ -40,6 +41,7 @@ class ConnectionManagerTest : CardReaderBaseUnitTest() { private val terminalWrapper: TerminalWrapper = mock() private val bluetoothReaderListener: BluetoothReaderListenerImpl = mock() + private val tapToPayReaderListenerImpl: TapToPayReaderListenerImpl = mock() private val discoverReadersAction: DiscoverReadersAction = mock() private val terminalListenerImpl: TerminalListenerImpl = mock { on { readerStatus }.thenReturn(MutableStateFlow(CardReaderStatus.NotConnected())) @@ -62,6 +64,7 @@ class ConnectionManagerTest : CardReaderBaseUnitTest() { connectionManager = ConnectionManager( terminalWrapper, bluetoothReaderListener, + tapToPayReaderListenerImpl, discoverReadersAction, terminalListenerImpl, application, @@ -130,7 +133,7 @@ class ConnectionManagerTest : CardReaderBaseUnitTest() { ) val discoveredBuiltInReaders = listOf( mock { - on { deviceType }.thenReturn(DeviceType.COTS_DEVICE) + on { deviceType }.thenReturn(DeviceType.TAP_TO_PAY_DEVICE) } ) whenever(discoverReadersAction.discoverExternalReaders(anyBoolean())) @@ -144,7 +147,7 @@ class ConnectionManagerTest : CardReaderBaseUnitTest() { ).toList() assertThat((result[0] as ReadersFound).list[0].type).isEqualTo( - ReaderType.BuildInReader.CotsDevice.name + ReaderType.BuildInReader.TapToPayDevice.name ) assertThat((result[0] as ReadersFound).list.size).isEqualTo(1) @@ -194,7 +197,7 @@ class ConnectionManagerTest : CardReaderBaseUnitTest() { testBlocking { val discoveredReaders = listOf( mock { - on { deviceType }.thenReturn(DeviceType.COTS_DEVICE) + on { deviceType }.thenReturn(DeviceType.TAP_TO_PAY_DEVICE) } ) whenever(discoverReadersAction.discoverBuildInReaders(anyBoolean())) @@ -203,12 +206,12 @@ class ConnectionManagerTest : CardReaderBaseUnitTest() { val result = connectionManager.discoverReaders( true, CardReaderTypesToDiscover.SpecificReaders.BuiltInReaders( - listOf(ReaderType.BuildInReader.CotsDevice) + listOf(ReaderType.BuildInReader.TapToPayDevice) ) ).toList() assertThat((result.first() as ReadersFound).list[0].type).isEqualTo( - ReaderType.BuildInReader.CotsDevice.name + ReaderType.BuildInReader.TapToPayDevice.name ) assertThat((result.first() as ReadersFound).list.size).isEqualTo(1) } @@ -243,7 +246,7 @@ class ConnectionManagerTest : CardReaderBaseUnitTest() { val cardReader: CardReaderImpl = mock { on { cardReader }.thenReturn(reader) } - whenever(terminalWrapper.connectToReader(any(), any(), any(), any())).thenAnswer { + whenever(terminalWrapper.connectToReader(any(), any(), any())).thenAnswer { (it.arguments[2] as ReaderCallback).onSuccess(mock()) } @@ -262,12 +265,12 @@ class ConnectionManagerTest : CardReaderBaseUnitTest() { on { cardReader }.thenReturn(reader) } val message = "error_message" - val errorCode = TerminalException.TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_READER_ERROR + val errorCode = TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_READER_ERROR val exception: TerminalException = mock { on { errorMessage }.thenReturn(message) on { this.errorCode }.thenReturn(errorCode) } - whenever(terminalWrapper.connectToReader(any(), any(), any(), any())).thenAnswer { + whenever(terminalWrapper.connectToReader(any(), any(), any())).thenAnswer { (it.arguments[2] as ReaderCallback).onFailure(exception) } @@ -291,12 +294,12 @@ class ConnectionManagerTest : CardReaderBaseUnitTest() { on { cardReader }.thenReturn(reader) } val message = "error_message" - val errorCode = TerminalException.TerminalErrorCode.READER_BATTERY_CRITICALLY_LOW + val errorCode = TerminalErrorCode.READER_BATTERY_CRITICALLY_LOW val exception: TerminalException = mock { on { errorMessage }.thenReturn(message) on { this.errorCode }.thenReturn(errorCode) } - whenever(terminalWrapper.connectToReader(any(), any(), any(), any())).thenAnswer { + whenever(terminalWrapper.connectToReader(any(), any(), any())).thenAnswer { (it.arguments[2] as ReaderCallback).onFailure(exception) } @@ -319,7 +322,7 @@ class ConnectionManagerTest : CardReaderBaseUnitTest() { val cardReader: CardReaderImpl = mock { on { cardReader }.thenReturn(reader) } - whenever(terminalWrapper.connectToReader(any(), any(), any(), any())).thenAnswer { + whenever(terminalWrapper.connectToReader(any(), any(), any())).thenAnswer { (it.arguments[2] as ReaderCallback).onSuccess(cardReader.cardReader) } diff --git a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/TerminalListenerImplTest.kt b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/TerminalListenerImplTest.kt index 4b601de5560..5753445d84d 100644 --- a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/TerminalListenerImplTest.kt +++ b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/TerminalListenerImplTest.kt @@ -13,8 +13,8 @@ class TerminalListenerImplTest { private val listener = TerminalListenerImpl(logWrapper) @Test - fun `when reader unexpectedly disconnected, then not connected status emitted`() { - listener.onUnexpectedReaderDisconnect(mock()) + fun `when reader disconnects, then not connected status emitted`() { + listener.onConnectionStatusChange(ConnectionStatus.NOT_CONNECTED) assertThat(listener.readerStatus.value).isEqualTo(CardReaderStatus.NotConnected()) } diff --git a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/UpdateErrorMapperTest.kt b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/UpdateErrorMapperTest.kt index 1ab831a6daf..83c66ce2d51 100644 --- a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/UpdateErrorMapperTest.kt +++ b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/UpdateErrorMapperTest.kt @@ -1,6 +1,6 @@ package com.woocommerce.android.cardreader.internal.connection -import com.stripe.stripeterminal.external.models.TerminalException +import com.stripe.stripeterminal.external.models.TerminalErrorCode import com.woocommerce.android.cardreader.connection.event.SoftwareUpdateStatusErrorType import org.junit.Assert.assertEquals import org.junit.Test @@ -14,7 +14,7 @@ class UpdateErrorMapperTest { @Test fun `given bluetooth error, when mapping, then failed returns`() { // GIVEN - val error = TerminalException.TerminalErrorCode.BLUETOOTH_ERROR + val error = TerminalErrorCode.BLUETOOTH_ERROR // WHEN val result = mapper.map(error) @@ -26,7 +26,7 @@ class UpdateErrorMapperTest { @Test fun `given reader error, when mapping, then reader error returns`() { // GIVEN - val error = TerminalException.TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_READER_ERROR + val error = TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_READER_ERROR // WHEN val result = mapper.map(error) @@ -38,7 +38,7 @@ class UpdateErrorMapperTest { @Test fun `given server error, when mapping, then server error returns`() { // GIVEN - val error = TerminalException.TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_SERVER_ERROR + val error = TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_SERVER_ERROR // WHEN val result = mapper.map(error) @@ -52,7 +52,7 @@ class UpdateErrorMapperTest { // GIVEN val batteryLevel = 0.3f whenever(batteryLevelProvider.invoke()).thenReturn(batteryLevel) - val error = TerminalException.TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_BATTERY_LOW + val error = TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_BATTERY_LOW // WHEN val result = mapper.map(error) @@ -64,7 +64,7 @@ class UpdateErrorMapperTest { @Test fun `given interrupted error, when mapping, then interrupted error returns`() { // GIVEN - val error = TerminalException.TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_INTERRUPTED + val error = TerminalErrorCode.READER_SOFTWARE_UPDATE_FAILED_INTERRUPTED // WHEN val result = mapper.map(error) diff --git a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/actions/DiscoverReadersActionTest.kt b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/actions/DiscoverReadersActionTest.kt index 62e3c370fda..49ad16a592c 100644 --- a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/actions/DiscoverReadersActionTest.kt +++ b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/connection/actions/DiscoverReadersActionTest.kt @@ -230,7 +230,7 @@ class DiscoverReadersActionTest : CardReaderBaseUnitTest() { any() ) assertThat(configCaptor.firstValue).isEqualTo( - DiscoveryConfiguration.LocalMobileDiscoveryConfiguration( + DiscoveryConfiguration.TapToPayDiscoveryConfiguration( true ) ) diff --git a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/payments/PaymentErrorMapperTest.kt b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/payments/PaymentErrorMapperTest.kt index a45959026c7..37abdef2b3e 100644 --- a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/payments/PaymentErrorMapperTest.kt +++ b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/payments/PaymentErrorMapperTest.kt @@ -1,9 +1,9 @@ package com.woocommerce.android.cardreader.internal.payments import com.stripe.stripeterminal.external.models.PaymentIntent +import com.stripe.stripeterminal.external.models.TerminalErrorCode +import com.stripe.stripeterminal.external.models.TerminalErrorCode.DECLINED_BY_READER import com.stripe.stripeterminal.external.models.TerminalException -import com.stripe.stripeterminal.external.models.TerminalException.TerminalErrorCode -import com.stripe.stripeterminal.external.models.TerminalException.TerminalErrorCode.DECLINED_BY_READER import com.woocommerce.android.cardreader.CardReaderStore.CapturePaymentResponse import com.woocommerce.android.cardreader.internal.CardReaderBaseUnitTest import com.woocommerce.android.cardreader.payments.CardPaymentStatus.CardPaymentStatusErrorType.BuiltInReader @@ -562,7 +562,7 @@ class PaymentErrorMapperTest : CardReaderBaseUnitTest() { @Test fun `given local_mobile_nfc_disabled, when terminal exception thrown, then nfc disabled type returned`() { - whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.LOCAL_MOBILE_NFC_DISABLED) + whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.TAP_TO_PAY_NFC_DISABLED) val result = mapper.mapTerminalError(mock(), terminalException) @@ -571,7 +571,7 @@ class PaymentErrorMapperTest : CardReaderBaseUnitTest() { @Test fun `given local_mobile_library_not_included, when terminal exception thrown, then invalid app setup returned`() { - whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.LOCAL_MOBILE_LIBRARY_NOT_INCLUDED) + whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.TAP_TO_PAY_LIBRARY_NOT_INCLUDED) val result = mapper.mapTerminalError(mock(), terminalException) @@ -580,7 +580,7 @@ class PaymentErrorMapperTest : CardReaderBaseUnitTest() { @Test fun `given local_mobile_unsupported_device, when terminal exception thrown, then device unsupported returned`() { - whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.LOCAL_MOBILE_UNSUPPORTED_DEVICE) + whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.TAP_TO_PAY_UNSUPPORTED_DEVICE) val result = mapper.mapTerminalError(mock(), terminalException) @@ -589,7 +589,7 @@ class PaymentErrorMapperTest : CardReaderBaseUnitTest() { @Test fun `given local_mobile_unsupported_android_version, when terminal exception thrown, then device unsupported`() { - whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.LOCAL_MOBILE_UNSUPPORTED_ANDROID_VERSION) + whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.TAP_TO_PAY_UNSUPPORTED_ANDROID_VERSION) val result = mapper.mapTerminalError(mock(), terminalException) @@ -598,7 +598,7 @@ class PaymentErrorMapperTest : CardReaderBaseUnitTest() { @Test fun `given local_mobile_device_tampered, when terminal exception thrown, then device unsupported returned`() { - whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.LOCAL_MOBILE_DEVICE_TAMPERED) + whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.TAP_TO_PAY_DEVICE_TAMPERED) val result = mapper.mapTerminalError(mock(), terminalException) diff --git a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/payments/RefundErrorMapperTest.kt b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/payments/RefundErrorMapperTest.kt index 916d7ff061a..9866aebb6e6 100644 --- a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/payments/RefundErrorMapperTest.kt +++ b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/payments/RefundErrorMapperTest.kt @@ -1,5 +1,6 @@ package com.woocommerce.android.cardreader.internal.payments +import com.stripe.stripeterminal.external.models.TerminalErrorCode import com.stripe.stripeterminal.external.models.TerminalException import com.woocommerce.android.cardreader.payments.CardInteracRefundStatus.RefundStatusErrorType.Cancelled import com.woocommerce.android.cardreader.payments.CardInteracRefundStatus.RefundStatusErrorType.DeclinedByBackendError @@ -22,7 +23,7 @@ class RefundErrorMapperTest { private val refundParameters: RefundParams = mock() private val terminalException = mock().also { - whenever(it.errorCode).thenReturn(TerminalException.TerminalErrorCode.DECLINED_BY_READER) + whenever(it.errorCode).thenReturn(TerminalErrorCode.DECLINED_BY_READER) whenever(it.errorMessage).thenReturn("Dummy error message") } @@ -33,7 +34,7 @@ class RefundErrorMapperTest { @Test fun `when Terminal exception thrown, then refund params is used`() { - whenever(terminalException.errorCode).thenReturn(TerminalException.TerminalErrorCode.DECLINED_BY_STRIPE_API) + whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.DECLINED_BY_STRIPE_API) val refundParams = RefundParams( chargeId = "", amount = BigDecimal.TEN, @@ -46,7 +47,7 @@ class RefundErrorMapperTest { @Test fun `when PAYMENT_DECLINED_BY_STRIPE_API Terminal exception thrown, then PAYMENT_DECLINED type returned`() { - whenever(terminalException.errorCode).thenReturn(TerminalException.TerminalErrorCode.DECLINED_BY_STRIPE_API) + whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.DECLINED_BY_STRIPE_API) val result = mapper.mapTerminalError(refundParameters, terminalException) @@ -66,7 +67,7 @@ class RefundErrorMapperTest { @Test fun `when STRIPE_API_CONNECTION_ERROR Terminal exception thrown, then NO_NETWORK type returned`() { whenever(terminalException.errorCode).thenReturn( - TerminalException.TerminalErrorCode.STRIPE_API_CONNECTION_ERROR + TerminalErrorCode.STRIPE_API_CONNECTION_ERROR ) val result = mapper.mapTerminalError(refundParameters, terminalException) @@ -77,7 +78,7 @@ class RefundErrorMapperTest { @Test fun `when CANCELLED Terminal exception thrown, then CANCELLED type returned`() { whenever(terminalException.errorCode).thenReturn( - TerminalException.TerminalErrorCode.CANCELED + TerminalErrorCode.CANCELED ) val result = mapper.mapTerminalError(refundParameters, terminalException) @@ -87,7 +88,7 @@ class RefundErrorMapperTest { @Test fun `when PAYMENT_DECLINED Terminal exception throw with null code, then unknown type returned`() { - whenever(terminalException.errorCode).thenReturn(TerminalException.TerminalErrorCode.DECLINED_BY_STRIPE_API) + whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.DECLINED_BY_STRIPE_API) whenever(terminalException.apiError).thenReturn(mock()) val result = mapper.mapTerminalError(refundParameters, terminalException) @@ -517,7 +518,7 @@ class RefundErrorMapperTest { } private fun setupStripeApiCardDeclined(declineCode: String?) { - whenever(terminalException.errorCode).thenReturn(TerminalException.TerminalErrorCode.DECLINED_BY_STRIPE_API) + whenever(terminalException.errorCode).thenReturn(TerminalErrorCode.DECLINED_BY_STRIPE_API) whenever(terminalException.apiError).thenReturn(mock()) whenever(terminalException.apiError?.declineCode).thenReturn(declineCode) } diff --git a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/payments/actions/ProcessPaymentActionTest.kt b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/payments/actions/ProcessPaymentActionTest.kt index 744dc7c2934..df91895467f 100644 --- a/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/payments/actions/ProcessPaymentActionTest.kt +++ b/libs/cardreader/src/test/java/com/woocommerce/android/cardreader/internal/payments/actions/ProcessPaymentActionTest.kt @@ -1,5 +1,6 @@ package com.woocommerce.android.cardreader.internal.payments.actions +import com.stripe.stripeterminal.external.callable.Cancelable import com.stripe.stripeterminal.external.callable.PaymentIntentCallback import com.stripe.stripeterminal.external.models.PaymentIntent import com.woocommerce.android.cardreader.internal.CardReaderBaseUnitTest @@ -29,6 +30,7 @@ internal class ProcessPaymentActionTest : CardReaderBaseUnitTest() { fun `when processing payment succeeds, then Success is emitted`() = testBlocking { whenever(terminal.processPayment(any(), any())).thenAnswer { (it.arguments[1] as PaymentIntentCallback).onSuccess(mock()) + mock() } val result = action.processPayment(mock()).first() @@ -40,6 +42,7 @@ internal class ProcessPaymentActionTest : CardReaderBaseUnitTest() { fun `when processing payment fails, then Failure is emitted`() = testBlocking { whenever(terminal.processPayment(any(), any())).thenAnswer { (it.arguments[1] as PaymentIntentCallback).onFailure(mock()) + mock() } val result = action.processPayment(mock()).first() @@ -52,6 +55,7 @@ internal class ProcessPaymentActionTest : CardReaderBaseUnitTest() { val updatedPaymentIntent = mock() whenever(terminal.processPayment(any(), any())).thenAnswer { (it.arguments[1] as PaymentIntentCallback).onSuccess(updatedPaymentIntent) + mock() } val result = action.processPayment(mock()).first() @@ -63,6 +67,7 @@ internal class ProcessPaymentActionTest : CardReaderBaseUnitTest() { fun `when processing payment succeeds, then flow is terminated`() = testBlocking { whenever(terminal.processPayment(any(), any())).thenAnswer { (it.arguments[1] as PaymentIntentCallback).onSuccess(mock()) + mock() } val result = action.processPayment(mock()).toList() @@ -74,6 +79,7 @@ internal class ProcessPaymentActionTest : CardReaderBaseUnitTest() { fun `when processing payment fails, then flow is terminated`() = testBlocking { whenever(terminal.processPayment(any(), any())).thenAnswer { (it.arguments[1] as PaymentIntentCallback).onFailure(mock()) + mock() } val result = action.processPayment(mock()).toList()