From f7c49202975b40ebaf30bed52f335ce8a49443fd Mon Sep 17 00:00:00 2001
From: moon <56061215+MgKyawLay@users.noreply.github.com>
Date: Thu, 19 Mar 2026 15:36:39 +0630
Subject: [PATCH] ECR connect
---
app/build.gradle | 1 +
app/src/main/AndroidManifest.xml | 12 +++
.../main/java/com/utsmm/kbz/MainActivity.java | 15 ++++
.../main/java/com/utsmm/kbz/MainFragment.java | 67 +++++++++++++++
.../java/com/utsmm/kbz/UsbSerialManager.java | 83 +++++++++++++++++++
app/src/main/res/xml/device_filter.xml | 4 +
6 files changed, 182 insertions(+)
create mode 100644 app/src/main/java/com/utsmm/kbz/UsbSerialManager.java
create mode 100644 app/src/main/res/xml/device_filter.xml
diff --git a/app/build.gradle b/app/build.gradle
index 60e4d69..5eb5956 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -125,6 +125,7 @@ dependencies {
def testRunnerVersion = "1.5.2"
def testRulesVersion = "1.5.0"
// def nav_version = "2.4.1"
+ implementation 'com.github.mik3y:usb-serial-for-android:3.9.0'
implementation 'com.android.support:multidex:1.0.3'
// QR
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9c36dce..2cbf5ff 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -35,6 +35,9 @@
+
+
+
@@ -56,6 +59,7 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme.NoActionBar">
+
@@ -69,6 +73,14 @@
+
+
+
+
+
+
diff --git a/app/src/main/java/com/utsmm/kbz/MainActivity.java b/app/src/main/java/com/utsmm/kbz/MainActivity.java
index 1f6b5a3..e94de27 100644
--- a/app/src/main/java/com/utsmm/kbz/MainActivity.java
+++ b/app/src/main/java/com/utsmm/kbz/MainActivity.java
@@ -14,12 +14,17 @@ import androidx.navigation.ui.NavigationUI;
import android.app.AlarmManager;
import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
+import android.util.Log;
import android.view.Gravity;
import android.view.WindowManager;
import android.widget.Toast;
@@ -31,8 +36,14 @@ import com.nexgo.downloadkey.downloadflow.DownloadFlow;
import com.nexgo.downloadkey.downloadflow.DownloadFlowProcessListener;
import com.nexgo.downloadkey.downloadflow.DownloadFlowResultEntity;
import com.nexgo.downloadkey.downloadflow.DownloadResult;
+import com.nexgo.oaf.apiv3.APIProxy;
+import com.nexgo.oaf.apiv3.DeviceEngine;
import com.nexgo.oaf.apiv3.device.pinpad.PinPad;
import com.nexgo.oaf.apiv3.device.pinpad.WorkKeyTypeEnum;
+import com.nexgo.oaf.apiv3.device.serialport.SerialPortDriver;
+import com.nexgo.oaf.apiv3.device.usbserial.OnUsbSerialReadListener;
+import com.nexgo.oaf.apiv3.device.usbserial.UsbSerial;
+import com.nexgo.oaf.apiv3.device.usbserial.UsbSerialCfgEntity;
import com.utsmyanmar.baselib.BaseApplication;
import com.utsmyanmar.baselib.repo.Repository;
import com.utsmyanmar.baselib.ui.AnimationDialog;
@@ -59,6 +70,7 @@ import com.utsmm.kbz.util.ecr.CoreUtils;
import com.utsmm.kbz.util.tms.TMSUtil;
import java.util.Calendar;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -107,6 +119,7 @@ public class MainActivity extends AppCompatActivity implements
// Set of fragment IDs that should handle back press specially
private final Set specialBackHandlingFragments = new HashSet<>();
+
@Inject
Repository repository;
@@ -157,6 +170,8 @@ public class MainActivity extends AppCompatActivity implements
}
+
+
private void initKey(){
// SystemParamsOperation.getInstance().setTmsAddress("https://api-tms-uat.kbzbank.com:8443/sirius");
SystemParamsOperation.getInstance().setTmsAddress("https://sirius-nest.utsmyanmar.com");
diff --git a/app/src/main/java/com/utsmm/kbz/MainFragment.java b/app/src/main/java/com/utsmm/kbz/MainFragment.java
index a42c1ae..bc2e9dc 100644
--- a/app/src/main/java/com/utsmm/kbz/MainFragment.java
+++ b/app/src/main/java/com/utsmm/kbz/MainFragment.java
@@ -20,6 +20,11 @@ import androidx.lifecycle.Observer;
import com.denzcoskun.imageslider.ImageSlider;
import com.denzcoskun.imageslider.constants.ScaleTypes;
import com.denzcoskun.imageslider.models.SlideModel;
+import com.nexgo.oaf.apiv3.APIProxy;
+import com.nexgo.oaf.apiv3.DeviceEngine;
+import com.nexgo.oaf.apiv3.SdkResult;
+import com.nexgo.oaf.apiv3.device.serialport.SerialCfgEntity;
+import com.nexgo.oaf.apiv3.device.serialport.SerialPortDriver;
import com.nexgo.oaf.apiv3.emv.AidEntity;
import com.nexgo.oaf.apiv3.emv.CapkEntity;
//import com.pos.connection.bridge.binder.ECRConstant;
@@ -191,6 +196,7 @@ public class MainFragment extends DataBindingFragment {
safeNavigateToRouteId();
}
}
+
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
@@ -235,6 +241,9 @@ public class MainFragment extends DataBindingFragment {
// enableHomeButton();
}
+ private SerialPortDriver port;
+ private boolean isRunning = false;
+
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
@@ -251,6 +260,64 @@ public class MainFragment extends DataBindingFragment {
// queryAidCAPKList();
queryAidCAPKList();
// generateMockQR();
+ DeviceEngine deviceEngine = APIProxy.getDeviceEngine(requireContext());
+
+ port = deviceEngine.getSerialPortDriver(0);
+
+ SerialCfgEntity entity = new SerialCfgEntity();
+ entity.setBaudRate(115200);
+ entity.setDataBits(8);
+ entity.setParity('n');
+ entity.setStopBits(1);
+
+ int result = port.connect(entity);
+
+ if (result == SdkResult.Success) {
+
+ LogUtil.d("USB", "USB Serial connected");
+ String echo = "Hello ECR";
+ byte[] data = echo.getBytes(StandardCharsets.UTF_8);
+ port.send(data, data.length);
+
+ port.clrBuffer();
+
+ isRunning = true;
+ startReceiveThread();
+
+ } else {
+
+ LogUtil.e("USB", "USB Serial connect failed");
+
+ }
+ }
+
+ private void startReceiveThread() {
+
+ new Thread(() -> {
+
+ byte[] buffer = new byte[2048];
+
+ while (isRunning) {
+
+ int len = port.recv(buffer, buffer.length, 3000);
+
+ if (len > 0) {
+
+ String msg = new String(buffer, 0, len);
+
+ LogUtil.d("USB", "Received: " + msg);
+
+ requireActivity().runOnUiThread(() -> {
+
+ // update UI here
+ // example:
+ // binding.txtResult.setText(msg);
+
+ });
+ }
+ }
+
+ }).start();
}
diff --git a/app/src/main/java/com/utsmm/kbz/UsbSerialManager.java b/app/src/main/java/com/utsmm/kbz/UsbSerialManager.java
new file mode 100644
index 0000000..7e96f82
--- /dev/null
+++ b/app/src/main/java/com/utsmm/kbz/UsbSerialManager.java
@@ -0,0 +1,83 @@
+package com.utsmm.kbz;
+
+import android.content.Context;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbDeviceConnection;
+import android.hardware.usb.UsbManager;
+
+import com.utsmyanmar.paylibs.utils.LogUtil;
+import com.xgd.android.usbserial.driver.CdcAcmSerialDriver;
+import com.xgd.android.usbserial.driver.UsbSerialDriver;
+import com.xgd.android.usbserial.driver.UsbSerialPort;
+import com.xgd.android.usbserial.driver.UsbSerialProber;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+
+public class UsbSerialManager {
+
+ private UsbSerialPort port;
+
+ public boolean connect(Context context) {
+ UsbManager manager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
+ HashMap deviceList = manager.getDeviceList();
+ LogUtil.d("USB", "device list " + deviceList.values().toString());
+ for (UsbDevice device: deviceList.values()){
+ LogUtil.d("USB", "Device => " + device.getDeviceName());
+ LogUtil.d("USB", "VID => " + device.getVendorId());
+ LogUtil.d("USB", "PID => " + device.getProductId());
+ }
+
+ List drivers =
+ UsbSerialProber.getDefaultProber().findAllDrivers(manager);
+
+ if (drivers.isEmpty()) return false;
+
+ UsbSerialDriver driver = drivers.get(0);
+ UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
+
+ if (connection == null) return false;
+
+ port = driver.getPorts().get(0);
+
+ try {
+ port.open(connection);
+
+ port.setParameters(
+ 9600,
+ 8,
+ UsbSerialPort.STOPBITS_1,
+ UsbSerialPort.PARITY_NONE
+ );
+
+ return true;
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ public void send(byte[] data) throws IOException {
+ if (port != null) {
+ port.write(data, 1000);
+ }
+ }
+
+ public byte[] read() throws IOException {
+ byte[] buffer = new byte[64];
+ int len = port.read(buffer, 1000);
+
+ byte[] result = new byte[len];
+ System.arraycopy(buffer, 0, result, 0, len);
+
+ return result;
+ }
+
+ public void close() throws IOException {
+ if (port != null) {
+ port.close();
+ }
+ }
+}
diff --git a/app/src/main/res/xml/device_filter.xml b/app/src/main/res/xml/device_filter.xml
new file mode 100644
index 0000000..109063f
--- /dev/null
+++ b/app/src/main/res/xml/device_filter.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file