stripe-terminal-android
stripe-terminal-android copied to clipboard
IOException -> HandoffRpcCallbackListener message="Handoff client received Legacy callback"
Summary
When I'm running my android app, I'm constantly and randomly receiving the errors in the title.
This is the stacktrace:
2024-08-01 11:36:13.072 8404-8470 StripeTerminal I class=TerminalStatusManager message="reportCardStatusChange CARD_REMOVED."
2024-08-01 11:36:13.073 8404-8470 StripeTerminal I class=ProxyReaderListener message=onReportReaderEvent(CARD_REMOVED)
2024-08-01 11:36:13.074 8404-8477 StripeTerminal D class=AidlRpcClient message=makeRequest service=HANDOFF_SERVICE method=ACTIVATE_TERMINAL requestId=1
2024-08-01 11:36:13.074 8404-8427 StripeTerminal E class=HandoffRpcCallbackListener message="Handoff client received Legacy callback"
java.io.IOException: Empty request body
at com.stripe.stripeterminal.handoffclient.HandoffRpcCallbackListener.onUpdate(HandoffRpcCallbackListener.kt:45)
at com.stripe.core.aidlrpc.AidlRpcUpdateListener$Stub.onTransact(AidlRpcUpdateListener.java:74)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)
2024-08-01 11:36:13.080 8404-8470 StripeTerminal W class=HandoffRpcCallbackListener message="encountered unknown card status" cardStatus=null onReaderUpdate="OnReaderUpdate{offline_status_details_changed=OnOfflineStatusDetailsChanged{offline_stats=OfflineStats{payments_count=0, setup_intents_count=0}, network_status=ONLINE}}"
2024-08-01 11:36:13.082 8404-8423 StripeTerminal E class=HandoffRpcCallbackListener message="Handoff client received Legacy callback"
java.io.IOException: Empty request body
at com.stripe.stripeterminal.handoffclient.HandoffRpcCallbackListener.onUpdate(HandoffRpcCallbackListener.kt:45)
at com.stripe.core.aidlrpc.AidlRpcUpdateListener$Stub.onTransact(AidlRpcUpdateListener.java:74)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)
2024-08-01 11:36:13.088 8404-8427 StripeTerminal E class=HandoffRpcCallbackListener message="Handoff client received Legacy callback"
java.io.IOException: Empty request body
at com.stripe.stripeterminal.handoffclient.HandoffRpcCallbackListener.onUpdate(HandoffRpcCallbackListener.kt:45)
at com.stripe.core.aidlrpc.AidlRpcUpdateListener$Stub.onTransact(AidlRpcUpdateListener.java:74)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)
Code to reproduce
private val discoveryListener: DiscoveryListener = object : DiscoveryListener {
override fun onUpdateDiscoveredReaders(readers: List<Reader>) {
Log.i(TAG, "onUpdateDiscoveredReaders we have ${readers.size} readers")
val deviceSerialNumber = Build.getSerial()
val reader = readers.firstOrNull { it.networkStatus == Reader.NetworkStatus.ONLINE && it.serialNumber == deviceSerialNumber}
if (reader != null) {
Log.i(TAG, "We have a valid reader, so let's proceed")
targetReader = reader
targetReader.id?.let { id ->
Log.i(TAG, "We are saving the terminal model with id $id")
_localStorage.saveTerminalModel(TerminalModel(id))
Log.i(TAG, "Let's try to get the location")
getLocation(id)
}
Log.i(TAG, "Let's try to connect to the reader")
connectReader()
} else {
Log.i(TAG, "No reader could be found")
_userMessage.update {
"Unable to connect to the reader"
}
_settingStatus.update { SettingWorkFlow.GET_ERROR }
}
}
}
private val discoveryCallback: Callback = object : Callback {
override fun onSuccess() {
Log.d(TAG, "discoveryCallback onSuccess")
}
override fun onFailure(e: TerminalException) {
Log.e(TAG, "discoveryCallback onFailure", e)
_userMessage.update { TerminalExceptionWrapper(e).errorMessage }
_settingStatus.update { SettingWorkFlow.GET_ERROR }
}
}
fun discoveryReaders() {
Log.i(TAG, "start discovery reader")
discoveryTask = Terminal.getInstance().discoverReaders(
config,
discoveryListener,
discoveryCallback
)
}
fun connectReader() {
Log.i(TAG, "connect reader...")
getCurrentReader()?.let { reader ->
// same one , skip
if (targetReader.id == reader.id) {
Log.i(TAG, "Find reader")
return
}
// different reader , disconnect old first then connect new one again
val currentReader: Reader = reader
Terminal.getInstance().disconnectReader(object : Callback {
override fun onSuccess() {
Log.d(TAG, "Current Reader [ ${currentReader.id} ] disconnect success ")
}
override fun onFailure(e: TerminalException) {
Log.e(TAG, "Current Reader [ ${currentReader.id} ] disconnect fail ")
}
})
}
Log.i(TAG, "Connecting to new Reader [ ${targetReader.id} ] .... ")
val readerCallback: ReaderCallback = object : ReaderCallback {
override fun onSuccess(reader: Reader) {
Log.i(TAG, "Reader [ ${targetReader.id} ] Connected ")
}
override fun onFailure(e: TerminalException) {
Log.i(TAG, "readerCallback onFailure", e)
_userMessage.update { TerminalExceptionWrapper(e, _context).errorMessage }
}
}
val readerListener = object : HandoffReaderListener {
override fun onReportReaderEvent(event: ReaderEvent) {
super.onReportReaderEvent(event)
Log.d(TAG, "onReportReaderEvent: $event")
}
}
Terminal.getInstance().connectHandoffReader(
targetReader,
ConnectionConfiguration.HandoffConnectionConfiguration(),
readerListener,
readerCallback
)
}
Android version
Android 10, API 29
Impacted devices (Android devices or readers)
I'm testing in a S700 terminal reader
SDK version
I've tried several, including the latest 3.8.0