diff --git a/.kotlin/sessions/kotlin-compiler-14813118053369288560.salive b/.kotlin/sessions/kotlin-compiler-14813118053369288560.salive new file mode 100644 index 0000000..e69de29 diff --git a/app/build.gradle b/app/build.gradle index d79bdcf..bf6632e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { compileSdk 34 defaultConfig { - applicationId "com.utsmm.kbz" //mpu + applicationId "com.utsmm.kbz.uat" //mpu minSdk 24 targetSdk 33 versionCode 10 diff --git a/app/src/main/java/com/utsmm/kbz/ui/kpay/QRTransactionFragment.java b/app/src/main/java/com/utsmm/kbz/ui/kpay/QRTransactionFragment.java index bc8d8ea..f55e7c9 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/kpay/QRTransactionFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/kpay/QRTransactionFragment.java @@ -325,7 +325,7 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi if(payDetail.getQrTransStatus() != -1) { payDetail.setQrTransStatus(2); } - + sharedViewModel.pushReceipt(buildEReceiptQRReceipt(payDetail, false, "QR Expired!")); sharedViewModel.payDetail.postValue(payDetail); safeNavigateToRouteId(); @@ -333,6 +333,7 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi } catch (Exception e) { LogUtil.d(TAG, "On Exception::"); + sharedViewModel.pushReceipt(buildEReceiptQRReceipt(payDetail, false, "QR Failed! :" + e.getMessage())); e.printStackTrace(); if (count == totalCount) { diff --git a/app/src/main/java/com/utsmm/kbz/ui/navigation/NaviMainFragment.java b/app/src/main/java/com/utsmm/kbz/ui/navigation/NaviMainFragment.java index 102eed2..bf3b6c9 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/navigation/NaviMainFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/navigation/NaviMainFragment.java @@ -2,8 +2,20 @@ package com.utsmm.kbz.ui.navigation; import android.content.Context; import android.text.TextUtils; +import android.util.Log; +import com.nexgo.oaf.apiv3.APIProxy; +import com.nexgo.oaf.apiv3.DeviceEngine; +import com.nexgo.oaf.apiv3.DeviceInfo; +import com.nexgo.oaf.apiv3.SdkResult; +import com.nexgo.oaf.apiv3.device.printer.AlignEnum; +import com.nexgo.oaf.apiv3.device.printer.GrayLevelEnum; +import com.nexgo.oaf.apiv3.device.printer.LineOptionEntity; +import com.nexgo.oaf.apiv3.device.printer.Printer; import com.utsmyanmar.baselib.fragment.DataBindingFragment; +import com.utsmyanmar.baselib.network.model.sirius.SiriusHost; +import com.utsmyanmar.baselib.network.model.sirius.SiriusMerchant; +import com.utsmyanmar.baselib.network.model.sirius.SiriusResponse; import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.paylibs.Constant; import com.utsmyanmar.paylibs.sign_on.EchoTestProcess; @@ -13,6 +25,8 @@ import com.utsmm.kbz.BR; import com.utsmm.kbz.R; import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel; +import java.util.List; + public class NaviMainFragment extends DataBindingFragment { private OnFragmentInteractionListener mListener; @@ -137,6 +151,7 @@ public class NaviMainFragment extends DataBindingFragment { }); } + public void onClickLogOff() { showLoadingDialog("Sending LogOff!"); @@ -176,6 +191,148 @@ public class NaviMainFragment extends DataBindingFragment { mListener.onClickFunction(); } + private GrayLevelEnum getGrayLevel() { + int gray = 2; + GrayLevelEnum grayLevelEnum = GrayLevelEnum.LEVEL_1; + + + switch (gray) { + case 0: + grayLevelEnum = GrayLevelEnum.LEVEL_0; + break; + case 1: + grayLevelEnum = GrayLevelEnum.LEVEL_1; + break; + case 2: + grayLevelEnum = GrayLevelEnum.LEVEL_2; + break; + case 3: + grayLevelEnum = GrayLevelEnum.LEVEL_3; + break; + case 4: + grayLevelEnum = GrayLevelEnum.LEVEL_4; + break; + default: + grayLevelEnum = GrayLevelEnum.LEVEL_1; + break; + } + + return grayLevelEnum; + } + + public void onClickPrintConfig() { + + DeviceEngine deviceEngine = APIProxy.getDeviceEngine(requireContext()); + Printer printer = deviceEngine.getPrinter(); + DeviceInfo deviceInfo = deviceEngine.getDeviceInfo(); + + int FONT_NORMAL = 24; + int FONT_HEADER = 32; + + int status = printer.getStatus(); + if (status != SdkResult.Success) { + Log.d("Printer", "Printer error: " + status); + return; + } + + SystemParamsOperation sp = SystemParamsOperation.getInstance(); + + String addr1 = sp.getMerchantAddress(); + String addr2 = sp.getMerchantAddress2(); + String phone = sp.getMerchantPhoneNo(); + if (addr2 == null) addr2 = ""; + if (phone == null || phone.trim().isEmpty()) phone = ""; + + printer.setGray(getGrayLevel()); + + // ================== Header ================== + printer.appendPrnStr("==== Device Configs ====", FONT_HEADER, AlignEnum.CENTER, true); + printer.appendPrnStr(" ", FONT_NORMAL, AlignEnum.CENTER, false); + + if(!TextUtils.isEmpty(addr1)) + printer.appendPrnStr(addr1, FONT_NORMAL, AlignEnum.CENTER, true); + if(!TextUtils.isEmpty(addr2)) + printer.appendPrnStr(addr2, FONT_NORMAL, AlignEnum.CENTER, true); + if(!TextUtils.isEmpty(phone)) + printer.appendPrnStr(phone, FONT_NORMAL, AlignEnum.CENTER, true); + + printer.appendPrnStr(" ", FONT_NORMAL, AlignEnum.CENTER, false); + + + // ================== Device Info ================== + printer.appendPrnStr("Device S/N", deviceInfo.getSn(), FONT_NORMAL, true); + printer.appendPrnStr(" ", FONT_NORMAL, AlignEnum.CENTER, false); + + + // ================== Host Section ================== + printer.appendPrnStr("HOSTS", FONT_HEADER, AlignEnum.LEFT, true); + printer.appendPrnStr(" ", FONT_NORMAL, AlignEnum.CENTER, false); + + // ---- Primary Host ---- + printer.appendPrnStr("Name :", sp.getHostName(), FONT_NORMAL, false); + printTwoColWrapped(printer, "IP :", sp.getIpAddress(), FONT_NORMAL, false); + printTwoColWrapped(printer, "Sec IP :", sp.getSecIpAddress(), FONT_NORMAL, false); + printer.appendPrnStr("MID :", sp.getMerchantId(), FONT_NORMAL, false); + printer.appendPrnStr("TID :", sp.getTerminalId(), FONT_NORMAL, false); + + printer.appendPrnStr("--------------------------------", FONT_NORMAL, AlignEnum.LEFT, false); + + // ---- Secondary Host ---- + if (!TextUtils.isEmpty(sp.getSecHostName())) { + + printer.appendPrnStr("Name :", sp.getSecHostName(), FONT_NORMAL, false); + printTwoColWrapped(printer, "IP :", sp.getSecHostIpAddress(), FONT_NORMAL, false); + printTwoColWrapped(printer, "Sec IP :", sp.getSecHostSecIpAddress(), FONT_NORMAL, false); + printer.appendPrnStr("MID :", sp.getSecHostMerchantId(), FONT_NORMAL, false); + printer.appendPrnStr("TID :", sp.getSecHostTerminalId(), FONT_NORMAL, false); + + printer.appendPrnStr("--------------------------------", FONT_NORMAL, AlignEnum.LEFT, false); + } + + // ================== Start Printing ================== + printer.startPrint(true, ret -> { + if(ret == SdkResult.Success){ + Log.d("Printer", "Print success"); + } else { + Log.d("Printer", "Print failed: " + ret); + } + }); + } + + + private void printTwoColWrapped(Printer p, String left, String right, int font, Boolean isBold) { + + if (right == null) right = ""; + + int maxRight = 24; // recommended width for right column + + // If right text fits → print normally + if (right.length() <= maxRight) { + p.appendPrnStr(left, right, font, isBold); + return; + } + + // Otherwise wrap it + int start = 0; + boolean firstLine = true; + + while (start < right.length()) { + int end = Math.min(start + maxRight, right.length()); + String part = right.substring(start, end); + + if (firstLine) { + p.appendPrnStr(left, part, font, isBold); + firstLine = false; + } else { + // subsequent lines: blank left column + p.appendPrnStr(" ", part, font, isBold); + } + + start += maxRight; + } + } + + public void onClickVersion(){ mListener.onClickVersion(); } @@ -184,7 +341,6 @@ public class NaviMainFragment extends DataBindingFragment { mListener.onClickExit(); } - } public interface OnFragmentInteractionListener { @@ -195,5 +351,6 @@ public class NaviMainFragment extends DataBindingFragment { void onClickVersion(); void onClickExit(); + } } diff --git a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundProcessFragment.java b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundProcessFragment.java index efd5222..4bf196f 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundProcessFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundProcessFragment.java @@ -150,7 +150,6 @@ public class QRRefundProcessFragment extends DataBindingFragment { } else { LogUtil.d(TAG, "Refund failed!"); - payDetail.setQrTransStatus(-1); payDetail.setQrReferNo(referenceNo); payDetail.setReferNo(referenceNo); @@ -160,7 +159,8 @@ public class QRRefundProcessFragment extends DataBindingFragment { errorMsg = response.getResponse().getMsg(); } payDetail.setTradeResultDes(errorMsg); - + sharedViewModel.pushReceipt(buildEReceiptQRReceipt(payDetail, false, "Refund Failed! "+errorMsg)); + sharedViewModel.payDetail.setValue(payDetail); navigateToNext(); } diff --git a/app/src/main/res/drawable/ic_mmqr.png b/app/src/main/res/drawable/ic_mmqr.png new file mode 100644 index 0000000..376941f Binary files /dev/null and b/app/src/main/res/drawable/ic_mmqr.png differ diff --git a/app/src/main/res/layout/fragment_dashboard_screen.xml b/app/src/main/res/layout/fragment_dashboard_screen.xml index 7c00102..8705e73 100644 --- a/app/src/main/res/layout/fragment_dashboard_screen.xml +++ b/app/src/main/res/layout/fragment_dashboard_screen.xml @@ -266,8 +266,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + - KBZ + KBZ UAT SMILE-SIT SMILE-UAT SMILE-PLUS diff --git a/baselib/build.gradle b/baselib/build.gradle index a9136d6..1c599ae 100644 --- a/baselib/build.gradle +++ b/baselib/build.gradle @@ -14,6 +14,8 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" + buildConfigField "String", "ERECEIPT_SECRET", "\"${ERECEIPT_SECRET}\"" + // Room compiler options javaCompileOptions { diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java b/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java index bc0eb17..a885129 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java @@ -285,8 +285,8 @@ public class NetworkModule { tmsAddress = getTMSUrlFromNative(); } - String baseUrl = tmsAddress.trim() + "/api/v1/"; -// String baseUrl = tmsAddress.trim() + "/"; +// String baseUrl = tmsAddress.trim() + "/api/v1/"; + String baseUrl = tmsAddress.trim() + "/"; final Gson gson = @@ -398,9 +398,11 @@ public class NetworkModule { OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .build(); +// String baseUrl = "http://receipt-nest.utsmyanmar.com/"; + String baseUrl = "https://api-tms-uat.kbzbank.com:8443/receipt/"; return new Retrofit.Builder() - .baseUrl("http://receipt-nest.utsmyanmar.com/") // base URL + .baseUrl(baseUrl) .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .client(client) diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java b/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java index b95370a..5988cc3 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java @@ -6,6 +6,7 @@ import androidx.lifecycle.LiveData; import com.google.gson.Gson; import com.google.gson.JsonElement; +import com.utsmyanmar.baselib.BuildConfig; import com.utsmyanmar.baselib.db.dao.EmvDetailDao; import com.utsmyanmar.baselib.db.dao.PayDetailDao; import com.utsmyanmar.baselib.db.model.EmvDetail; @@ -106,7 +107,8 @@ public class Repository { return siriusApiService.getParams(siriusRequest); } public Observable sendReceipt(Object body){ - String apiSecret = "8f4df38d1001bcc4620b5c736c66a03eef4653eb3ba31105faa2f2ee294c4a46"; +// String apiSecret = "y812J21lhha11OS"; + String apiSecret = BuildConfig.ERECEIPT_SECRET; String timestamp = String.valueOf(System.currentTimeMillis()); String bodyString = new Gson().toJson(body); String dataToHash = bodyString + apiSecret + timestamp; diff --git a/gradle.properties b/gradle.properties index ef03384..afcdd41 100644 --- a/gradle.properties +++ b/gradle.properties @@ -28,4 +28,5 @@ android.useAndroidX=true # thereby reducing the size of the R class for that library android.nonTransitiveRClass=true # Disable Android Studio's Jetifier to avoid conflicts -android.enableJetifier=false \ No newline at end of file +android.enableJetifier=false +ERECEIPT_SECRET=y812J21lhha11OS diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java index c916e82..8a6dc29 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsSettings.java @@ -42,8 +42,8 @@ public class SystemParamsSettings implements Serializable { // private String tmsAddress = "https://tms.smile-mm.com"; // private String tmsAddress = "http://128.199.170.203"; - private String tmsAddress = "http://sirius-nest.utsmyanmar.com"; -// private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius"; +// private String tmsAddress = "http://sirius-nest.utsmyanmar.com"; + private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius"; private String terminalCapability = "E0E8C8";