@@ -29,6 +29,7 @@ import com.stripe.stripeterminal.external.callable.PaymentIntentCallback
29
29
import com.stripe.stripeterminal.external.callable.ReaderCallback
30
30
import com.stripe.stripeterminal.external.callable.TapToPayReaderListener
31
31
import com.stripe.stripeterminal.external.callable.TerminalListener
32
+ import com.stripe.stripeterminal.external.callable.HandoffReaderListener
32
33
import com.stripe.stripeterminal.external.models.BatteryStatus
33
34
import com.stripe.stripeterminal.external.models.CardPresentDetails
34
35
import com.stripe.stripeterminal.external.models.Cart
@@ -194,6 +195,9 @@ class StripeTerminal(
194
195
) {
195
196
config = DiscoveryConfiguration .BluetoothDiscoveryConfiguration (0 , this .isTest!! )
196
197
this .terminalConnectType = TerminalConnectTypes .Bluetooth
198
+ } else if (call.getString(" type" ) == TerminalConnectTypes .HandOff .webEventName) {
199
+ config = DiscoveryConfiguration .HandoffDiscoveryConfiguration ()
200
+ this .terminalConnectType = TerminalConnectTypes .HandOff
197
201
} else {
198
202
call.unimplemented(call.getString(" type" ) + " is not support now" )
199
203
return
@@ -240,6 +244,8 @@ class StripeTerminal(
240
244
this .connectUsbReader(call)
241
245
} else if (this .terminalConnectType == TerminalConnectTypes .Bluetooth ) {
242
246
this .connectBluetoothReader(call)
247
+ } else if (this .terminalConnectType == TerminalConnectTypes .HandOff ) {
248
+ this .connectHandOffReader(call)
243
249
} else {
244
250
call.reject(" type is not defined." )
245
251
}
@@ -440,6 +446,39 @@ class StripeTerminal(
440
446
Terminal .getInstance().connectReader(foundReader, config, this .readerCallback(call))
441
447
}
442
448
449
+ private fun connectHandOffReader (call : PluginCall ) {
450
+ val reader = call.getObject(" reader" )
451
+ val serialNumber = reader.getString(" serialNumber" )
452
+ val foundReader = this .discoveredReadersList.firstOrNull()
453
+
454
+ if (serialNumber == null || foundReader == null ) {
455
+ call.reject(" The reader value is not set correctly." )
456
+ return
457
+ }
458
+
459
+ val config: ConnectionConfiguration .HandoffConnectionConfiguration = ConnectionConfiguration .HandoffConnectionConfiguration (
460
+ this .handoffReaderListener
461
+ )
462
+
463
+ Terminal .getInstance().connectReader(foundReader, config, this .readerCallback(call))
464
+ }
465
+
466
+ var handoffReaderListener: HandoffReaderListener = object : HandoffReaderListener {
467
+ override fun onDisconnect (reason : DisconnectReason ) {
468
+ notifyListeners(
469
+ TerminalEnumEvent .DisconnectedReader .webEventName,
470
+ JSObject ().put(" reason" , reason.toString())
471
+ )
472
+ }
473
+
474
+ override fun onReportReaderEvent (event : ReaderEvent ) {
475
+ notifyListeners(
476
+ TerminalEnumEvent .ReaderEvent .webEventName,
477
+ JSObject ().put(" event" , event.toString())
478
+ )
479
+ }
480
+ }
481
+
443
482
fun cancelDiscoverReaders (call : PluginCall ) {
444
483
if (discoveryCancelable == null || discoveryCancelable!! .isCompleted) {
445
484
call.resolve()
0 commit comments