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 contextparams: PrintParameters
- parameters required to complete print jobresult: ActivityResultLauncher<Intent>
- activity result handler to receive activity resultcontext: Context
- activity/fragment contextprintParameters: PrintParameters
- parameters required to complete print jobrecieptInfo: ReceiptInfo
- ReceiptInfo object contained withinPaymentResult
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 contextparams: PrintParameters
- parameters required to complete print jobresult: 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
)