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() |