Printing

Attached printers (now supported with NEO plus bundle) can be detected using a call to isPrinterAvailable shown in below example usage:

YocoSDK.isPrinterAvailable { available, error ->
if (available) {
// Do printing
}
}

Print in charge flow

If SupportedReceiptType.PRINT receipt type is provided in list of SupportedReceiptTypes when performing a charge, a Print button is displayed in list of options on receipt screen. Print button press invokes below delegate method and gives opportunity to pass in required PrintParameters and initiate printing using YocoSDK.printReceipt():

Parameters

  • context: Context - activity/fragment context
  • params: PrintParameters - parameters required to complete print job
  • result: ActivityResultLauncher<Intent> - activity result handler to receive activity result
  • context: Context - activity/fragment context
  • printParameters: PrintParameters - parameters required to complete print job
  • recieptInfo: ReceiptInfo - ReceiptInfo object contained within PaymentResult
  • completionHandler: (printResult: PrintResult?) -> Unit - handler to receive print job result
import com.yoco.payment_ui_sdk.data.result.PrintResult
import com.yoco.payment_ui_sdk.data.params.MerchantInfo
import com.yoco.payment_ui_sdk.data.params.PrintParameters
import com.yoco.payment_ui_sdk.data.params.PrinterConfig
import com.yoco.payment_ui_sdk.data.delegates.UpdateReceiptProgress
import com.yoco.payment_ui_sdk.data.enums.ReceiptState
import com.yoco.payment_ui_sdk.data.enums.SupportedReceiptType
...
override fun printReceipt(
canPrintOnDevice: Boolean,
message: String?,
paymentResult: PaymentResult,
progress: UpdateReceiptProgress
) {
if (canPrintOnDevice) {
progress(ReceiptState.InProgress(message = "Printing..."))
YocoSDK.printReceipt(
requireContext(),
PrintParameters(
printRequestId = UUID.randomUUID().toString(),
clientTransactionId = paymentResult.clientTransactionId,
printerConfig = PrinterConfig(
autoPrint = false
),
merchantInfo = MerchantInfo("merchant-id", "merchant-name", "123-456-789", "business address"),
transactionType = TransactionType.GOODS,
signature = null,
metadata = null
),
paymentResult.receiptInfo!!
) {
it?.let {
Handler().postDelayed({
if (it.completed) {
progress(ReceiptState.Complete(message = "Printed successfully"))
} else {
progress(
ReceiptState.Error(
message = it.errorMessage ?: "Printing failed"
)
)
}
}, 1000)
}
}
}
}

Print with lookup

In order to print receipts for older transactions, a standalone printing flow is provided that takes in clientTransactionId param in PrintRequest to perform lookup and print. Example usage is given below:

Parameters

  • context: Context - activity/fragment context
  • params: PrintParameters - parameters required to complete print job
  • result: ActivityResultLauncher<Intent> - activity result handler to receive activity result
import com.yoco.payment_ui_sdk.data.result.PrintResult
import com.yoco.payment_ui_sdk.data.params.MerchantInfo
import com.yoco.payment_ui_sdk.data.params.PrintParameters
import com.yoco.payment_ui_sdk.data.params.PrinterConfig
import com.yoco.payment_ui_sdk.data.delegates.UpdateReceiptProgress
import com.yoco.payment_ui_sdk.data.enums.ReceiptState
import com.yoco.payment_ui_sdk.data.enums.SupportedReceiptType
...
private val printResult: ActivityResultLauncher<Intent> =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
System.err.println("Result Code: ${result.resultCode}") // PaymentSDK.Response.ResultCode
val printResult: PrintResult? =
result.data?.getSerializableExtra(PaymentResultInfo.ResultKeys.Print) as PrintResult?
System.err.println("Print Result: $printResult")
}
...
YocoSDK.print(
requireContext(),
PrintParameters(
printRequestId = UUID.randomUUID().toString(),
clientTransactionId = transactionIdStr,
printerConfig = PrinterConfig(
autoPrint = false
),
merchantInfo = MerchantInfo("merchant-id", "merchant-name", "123-456-789", "business address"),
transactionType = TransactionType.GOODS,
signature = null,
metadata = null
),
result = printResult
)