stripe-terminal-android icon indicating copy to clipboard operation
stripe-terminal-android copied to clipboard

IOException -> HandoffRpcCallbackListener message="Handoff client received Legacy callback"

Open josevsq1 opened this issue 6 months ago • 0 comments

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

josevsq1 avatar Aug 01 '24 09:08 josevsq1