10. Complete Integration Example

The example below shows a complete MainActivity that demonstrates the entire SDK flow: initialisation, key exchange, payment, receipt printing, and teardown.

ℹ️
NOTE This is the reference implementation. Copy this into your project and replace "MyApp" and "My Hospital" with your application and merchant details.

MainActivity — Full Integration

class MainActivity : FragmentActivity() {

    private val TAG = "MainActivity"

    private val pos by lazy {
        OctopusTMS.getInstance(
            context = applicationContext,
            config = OctopusTMS.Config(
                appName = "MyApp",
                enableLogs = BuildConfig.DEBUG
            )
        )
    }

    override fun onCreate(
        savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initSDK()
    }

    override fun onDestroy() {
        super.onDestroy()
        pos.destroy()
    }

    private fun initSDK() {
        pos.initialize { result ->
            when (result) {

                is OctopusTMS.InitResult.Success -> {
                    Log.d(TAG,
                        "OEM: ${result.detectedOEM}")

                    pos.downloadAndInjectKeys {
                        ok, terminalId, err ->

                        if (ok) {
                            Log.d(TAG,
                                "Ready: $terminalId")
                        }
                    }
                }

                is OctopusTMS.InitResult.Failed ->
                    Log.e(TAG,
                        "Init failed: ${result.reason}")

                is OctopusTMS.InitResult.UnsupportedDevice ->
                    Log.e(TAG, "Unsupported device")
            }
        }
    }

    fun onPayButtonClick() {
        pos.startPayment(
            activity = this,
            amountInCents = 50000L,
            merchantName = "My Hospital",
            listener = object : PaymentResultListener {

                override fun onApproved(
                    result: TransactionResult) {
                    Log.d(TAG,
                        "Approved RRN: ${result.rrn}")
                    printReceipt(result)
                }

                override fun onDeclined(
                    result: TransactionResult) {
                    Log.w(TAG,
                        "Declined: ${result.responseMessage}")
                }

                override fun onCancelled() {
                    Log.i(TAG, "Cancelled")
                }

                override fun onError(message: String) {
                    Log.e(TAG, "Error: $message")
                }
            }
        )
    }

    private fun printReceipt(result: TransactionResult) {
        val bitmap = BitmapBuilder(paperWidth = 384)
            .addLogo(logoBitmap, 150, 150)
            .addCentered("MY HOSPITAL", 19, true)
            .addGap(10)
            .addCentered("CUSTOMER RECEIPT", 23, true)
            .addGap(20)
            .addRow("TERMINAL ID:", result.terminalId)
            .addRow("TRAN REF:", result.transactionRef)
            .addStatusBanner("TRANSACTION SUCCESSFUL")
            .build()

        pos.print(bitmap) { ok, msg ->
            Log.d(TAG, "Print: ok=$ok msg=$msg")
        }
    }
}
public class MainActivity extends FragmentActivity {

    private static final String TAG = "MainActivity";
    private OctopusTMS pos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        pos = OctopusTMS.getInstance(
            getApplicationContext(),
            new OctopusTMS.Config("MyApp", BuildConfig.DEBUG)
        );

        initSDK();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        pos.destroy();
    }

    private void initSDK() {
        pos.initialize(result -> {
            if (result instanceof OctopusTMS.InitResult.Success) {
                OctopusTMS.InitResult.Success s =
                    (OctopusTMS.InitResult.Success) result;
                Log.d(TAG, "OEM: " + s.getDetectedOEM());

                pos.downloadAndInjectKeys(
                    (ok, terminalId, err) -> {
                        if (ok) {
                            Log.d(TAG, "Ready: " + terminalId);
                        }
                    }
                );

            } else if (result instanceof OctopusTMS.InitResult.Failed) {
                OctopusTMS.InitResult.Failed f =
                    (OctopusTMS.InitResult.Failed) result;
                Log.e(TAG, "Init failed: " + f.getReason());

            } else if (result instanceof
                    OctopusTMS.InitResult.UnsupportedDevice) {
                Log.e(TAG, "Unsupported device");
            }
        });
    }

    public void onPayButtonClick() {
        pos.startPayment(
            this,
            50000L,
            "My Hospital",
            new PaymentResultListener() {

                @Override
                public void onApproved(TransactionResult result) {
                    Log.d(TAG,
                        "Approved RRN: " + result.getRrn());
                    printReceipt(result);
                }

                @Override
                public void onDeclined(TransactionResult result) {
                    Log.w(TAG,
                        "Declined: " +
                        result.getResponseMessage());
                }

                @Override
                public void onCancelled() {
                    Log.i(TAG, "Cancelled");
                }

                @Override
                public void onError(String message) {
                    Log.e(TAG, "Error: " + message);
                }
            }
        );
    }

    private void printReceipt(TransactionResult result) {
        Bitmap bitmap = new BitmapBuilder(384)
            .addLogo(logoBitmap, 150, 150)
            .addCentered("MY HOSPITAL", 19, true)
            .addGap(10)
            .addCentered("CUSTOMER RECEIPT", 23, true)
            .addGap(20)
            .addRow("TERMINAL ID:", result.getTerminalId())
            .addRow("TRAN REF:", result.getTransactionRef())
            .addStatusBanner("TRANSACTION SUCCESSFUL")
            .build();

        pos.print(bitmap, (ok, msg) ->
            Log.d(TAG, "Print: ok=" + ok + " msg=" + msg));
    }
}

Integration Flow Summary

Step Method When
1 getInstance(context, config) Activity onCreate()
2 initialize(callback) Immediately after getInstance()
3 downloadAndInjectKeys(callback) Inside InitResult.Success — once per day
4 startPayment(activity, amount, merchant, listener) On user action, from main thread
5 buildReceiptBitmap() / BitmapBuilder Inside onApproved()
6 print(bitmap, callback) After bitmap is built
7 destroy() Activity onDestroy()