From 0f7b57e5161d450917e1b4de8c26a4adef9fcc21 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Sun, 11 Jan 2026 19:23:35 +0630 Subject: [PATCH 01/16] Update .gitignore --- .gitignore | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index c1cec63..7cf1c63 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ .cxx local.properties /.idea -/app/release -/app/sit/release -/app/uat/release \ No newline at end of file +/app/release/* +/app/sit/release/* +/app/uat/release/* +/app/uat +/.idea From b4ecd40b46be1ed4b9ef99cb07de2d7de28fb49e Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Sun, 11 Jan 2026 19:25:11 +0630 Subject: [PATCH 02/16] uat url changed --- app/build.gradle | 4 ++-- .../ui/core_ui/TransactionResultFragment.java | 4 ++-- .../kbz/ui/qr_pay/QRRefundProcessFragment.java | 1 - .../ui/qr_pay/RefundCertificateManager.java | 18 ++++++++---------- .../utsmyanmar/baselib/di/NetworkModule.java | 4 ++-- .../utils/core_utils/SystemParamsSettings.java | 8 ++++---- 6 files changed, 18 insertions(+), 21 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 083fb6c..cafa753 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId "com.utsmm.kbz" minSdk 24 targetSdk 33 - versionCode 15 - versionName "1.14" + versionCode 17 + versionName "1.16" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/TransactionResultFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/TransactionResultFragment.java index 0c3f03c..d174a43 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/TransactionResultFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/TransactionResultFragment.java @@ -172,9 +172,9 @@ public class TransactionResultFragment extends DataBindingFragment implements Da } else if (isQRPayNonSuccessTransaction(transactionType, payDetail)) { // startPrintProcess(false); if(transactionType == TransactionsType.MMQR_REFUND){ - showDeclineDialog("QR Refund Failed!"); + showDeclineDialog("QR Refund Failed! \n" + payDetail.getTradeResultDes()); }else{ - showDeclineDialog("QR Payment Failed!"); + showDeclineDialog("QR Payment Failed! \n" + payDetail.getTradeResultDes()); } navigateToMainScreen(); } else if (isQRPaySuccessTransaction(transactionType, payDetail)) { 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 ecc0852..00d008d 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 @@ -144,7 +144,6 @@ public class QRRefundProcessFragment extends DataBindingFragment { private void handleRefundResponse(KPayRefund.RefundResponse response, String referenceNo, String orgAmount) { if (response != null && response.getResponse() != null && "REFUND_SUCCESS".equalsIgnoreCase(response.getResponse().getRefundStatus())) { LogUtil.d(TAG, "Refund successful!"); - String refundAmount = response.getResponse().getRefundAmount(); long text = POSUtil.getInstance().convertAmount(refundAmount); diff --git a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/RefundCertificateManager.java b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/RefundCertificateManager.java index 4bff838..18fd948 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/RefundCertificateManager.java +++ b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/RefundCertificateManager.java @@ -40,15 +40,13 @@ public class RefundCertificateManager { if (tmsAddress == null || tmsAddress.trim().isEmpty()) { LogUtil.e(TAG, "TMS address is empty"); return; - } + }; - String downloadBase = - tmsAddress.trim() + "/api/v1/file/download?filePath="; +// String downloadBase = tmsAddress.trim() + "/api/v1/file/download?filePath="; + String downloadBase = tmsAddress.trim() + "/file/download?filePath="; - String certUrl = - SystemParamsOperation.getInstance().getCertificateUrl(); - String clientCertUrl = - SystemParamsOperation.getInstance().getCertificateClientUrl(); + String certUrl = SystemParamsOperation.getInstance().getCertificateUrl(); + String clientCertUrl = SystemParamsOperation.getInstance().getCertificateClientUrl(); if (certUrl == null || clientCertUrl == null) { LogUtil.e(TAG, "Certificate URLs are missing"); @@ -58,9 +56,9 @@ public class RefundCertificateManager { String timestamp = String.valueOf(System.currentTimeMillis()); String signature = generateSignature(timestamp); - LogUtil.d(TAG, "Download base => " + downloadBase); - LogUtil.d(TAG, "Cert URL => " + certUrl); - LogUtil.d(TAG, "Client Cert URL => " + clientCertUrl); +// LogUtil.d(TAG, "Download base => " + downloadBase); +// LogUtil.d(TAG, "Cert URL => " + certUrl); +// LogUtil.d(TAG, "Client Cert URL => " + clientCertUrl); // ---------- CA CERT ---------- DownloadUtil.downloadCertificateRx( 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 7be62a0..51102e2 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java @@ -290,8 +290,8 @@ public class NetworkModule { tmsAddress = getTMSUrlFromNative(); } - String baseUrl = tmsAddress.trim() + "/api/v1/"; //for on prim -// String baseUrl = tmsAddress.trim() + "/"; //for uat +// String baseUrl = tmsAddress.trim() + "/api/v1/"; //for on prim + String baseUrl = tmsAddress.trim() + "/"; //for uat final Gson gson = new GsonBuilder().create(); 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 dc0a406..d887c91 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,10 +42,10 @@ 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"; //for uat - private String ereceiptAddress = "http://receipt-nest.utsmyanmar.com"; //for on prime -// private String ereceiptAddress = "https://api-tms-uat.kbzbank.com:8443/receipt"; //for uat +// private String tmsAddress = "http://sirius-nest.utsmyanmar.com"; + private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius"; //for uat +// private String ereceiptAddress = "http://receipt-nest.utsmyanmar.com"; //for on prime + private String ereceiptAddress = "https://api-tms-uat.kbzbank.com:8443/receipt"; //for uat private String terminalName = ""; From 89466f82097c6cf28dc0b911d499e870e81d20a5 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Mon, 12 Jan 2026 22:10:15 +0630 Subject: [PATCH 03/16] latest --- app/build.gradle | 8 +- app/proguard-rules.pro | 87 ++++++++++++++++++- .../paylibs/print/printx/BaseXPrint.java | 8 +- 3 files changed, 95 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cafa753..a168be9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId "com.utsmm.kbz" minSdk 24 targetSdk 33 - versionCode 17 - versionName "1.16" + versionCode 1 + versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -43,6 +43,7 @@ android { dimension "env" applicationId "com.utsmm.kbz" versionNameSuffix "" + resValue "string", "app_name", "KBZ-POS" } } @@ -76,7 +77,8 @@ android { buildTypes { release { - minifyEnabled false + minifyEnabled true + shrinkResources false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } debug { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index ffc2c10..e0365c6 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -23,4 +23,89 @@ # Keep Bouncy Castle classes for security providers -keep class org.bouncycastle.** { *; } --dontwarn org.bouncycastle.** \ No newline at end of file +-dontwarn org.bouncycastle.** +-keep class com.squareup.okhttp.** { *; } +-dontwarn org.conscrypt.Conscrypt$Version +-dontwarn org.conscrypt.Conscrypt +-dontwarn org.conscrypt.ConscryptHostnameVerifier +-dontwarn org.openjsse.javax.net.ssl.SSLParameters +-dontwarn org.openjsse.javax.net.ssl.SSLSocket +-dontwarn org.openjsse.net.ssl.OpenJSSE + +############################ +# HILT +############################ +-keep class dagger.hilt.** { *; } +-keep class javax.inject.** { *; } +-keep class * extends dagger.hilt.internal.GeneratedComponent { *; } +-keep class * extends dagger.hilt.internal.GeneratedComponentManager { *; } +-keep class hilt_aggregated_deps.** { *; } + +############################ +# ANDROIDX NAVIGATION +############################ +-keep class androidx.navigation.** { *; } + +############################ +# DATA BINDING +############################ +-keep class **.databinding.*Binding { *; } +-keep class androidx.databinding.** { *; } + +############################ +# FRAGMENTS +############################ +-keep class * extends androidx.fragment.app.Fragment + +############################ +# SERIALIZABLE / PARCELABLE +############################ +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; +} + +############################ +# NEXGO / SUNMI / PAYLIBS +############################ +-keep class com.nexgo.** { *; } +-keep class com.sunmi.** { *; } +-keep class com.utsmyanmar.** { *; } +-keep class com.kizzy.xpay.** { *; } + +############################ +# ENUMS (ISO / TRANSACTION TYPES) +############################ +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +# Keep Retrofit generic signatures +-keepattributes Signature +-keepattributes *Annotation* + +# RxJava +-keep class io.reactivex.** { *; } +-dontwarn io.reactivex.** + +# Retrofit +-keep class retrofit2.** { *; } +-dontwarn retrofit2.** + +# Your API interfaces +-keep interface com.utsmyanmar.baselib.api.** { *; } + +# Your response models +-keep class com.utsmyanmar.baselib.model.** { *; } + +# Keep model fields for Gson +-keepclassmembers class * { + @com.google.gson.annotations.SerializedName ; +} + +# Or keep all models directly (simpler & safer) +-keep class com.utsmyanmar.baselib.model.** { *; } + +-keep class androidx.lifecycle.** { *; } +-keep class * extends androidx.lifecycle.ViewModel { *; } +-keep class com.utsmyanmar.baselib.repo.** { *; } \ No newline at end of file diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index 674bb4d..a24aa96 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -343,9 +343,9 @@ public abstract class BaseXPrint { // print2ColumnsStringNoSpace("AID :", MPU_AID); // } - if (payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_ACCEPT) || payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_APPROVED)) { - print2ColumnsStringNoSpace("TXN ID :",payDetail.getReferNo()); - } +// if (payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_ACCEPT) || payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_APPROVED)) { +// print2ColumnsStringNoSpace("TXN ID :",payDetail.getReferNo()); +// } @@ -1115,7 +1115,7 @@ public abstract class BaseXPrint { // printer.appendPrnStr("TRACE NO:" + traceNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false); printer.appendPrnStr("INV NO :" + invoiceNo , fontNormal, AlignEnum.LEFT,false); } else if (!payDetail.getTransType().equals(SETTLEMENT) && !payDetail.getTransType().equals(SUMMARY) && payDetail.getTransactionType() != TransactionsType.MMQR_REFUND.value && payDetail.getTransactionType() != TransactionsType.MMQR.value) { - printer.appendPrnStr("BTH NO :" + batchNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false); + printer.appendPrnStr("BTH NO :" + batchNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false); } else if (payDetail.getTransType().equals(SUMMARY)) { printer.appendPrnStr("HOST :" + HOST_NAME_MPU + "", fontNormal, AlignEnum.LEFT,false); } From 398a0d79868873a598cecf5cad10e6ba9e877772 Mon Sep 17 00:00:00 2001 From: kizzy Date: Mon, 12 Jan 2026 23:14:22 +0700 Subject: [PATCH 04/16] optimized proguard rules --- app/proguard-rules.pro | 279 +++++++++++++----- baselib/proguard-rules.pro | 27 +- .../utsmyanmar/baselib/emv/EmvAppConfig.java | 1 - .../baselib/viewModel/EmvBaseViewModel.java | 2 +- paylibs/proguard-rules.pro | 20 +- 5 files changed, 256 insertions(+), 73 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index e0365c6..3b9d0f5 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -20,92 +20,233 @@ # hide the original source file name. #-renamesourcefileattribute SourceFile +-keepattributes Signature, *Annotation*, SourceFile, LineNumberTable, InnerClasses, EnclosingMethod +-dontwarn sun.misc.** -# Keep Bouncy Castle classes for security providers --keep class org.bouncycastle.** { *; } --dontwarn org.bouncycastle.** --keep class com.squareup.okhttp.** { *; } --dontwarn org.conscrypt.Conscrypt$Version --dontwarn org.conscrypt.Conscrypt --dontwarn org.conscrypt.ConscryptHostnameVerifier --dontwarn org.openjsse.javax.net.ssl.SSLParameters --dontwarn org.openjsse.javax.net.ssl.SSLSocket --dontwarn org.openjsse.net.ssl.OpenJSSE - -############################ -# HILT -############################ +# Hilt ProGuard Rules - CRITICAL FOR DEPENDENCY INJECTION +-dontwarn dagger.hilt.** -keep class dagger.hilt.** { *; } --keep class javax.inject.** { *; } --keep class * extends dagger.hilt.internal.GeneratedComponent { *; } --keep class * extends dagger.hilt.internal.GeneratedComponentManager { *; } --keep class hilt_aggregated_deps.** { *; } +-keep class * extends dagger.hilt.** { *; } -############################ -# ANDROIDX NAVIGATION -############################ --keep class androidx.navigation.** { *; } +# Keep all Hilt generated classes +-keep class **_HiltComponents { *; } +-keep class **_HiltComponents$* { *; } +-keep class **_HiltModules { *; } +-keep class **_HiltModules$* { *; } +-keep class * extends dagger.hilt.android.internal.managers.ApplicationComponentManager { *; } +-keep class * extends dagger.hilt.android.internal.managers.ActivityComponentManager { *; } +-keep class * extends dagger.hilt.android.internal.managers.FragmentComponentManager { *; } +-keep class * extends dagger.hilt.android.internal.managers.ViewComponentManager { *; } +-keep class * extends dagger.hilt.android.internal.managers.ServiceComponentManager { *; } -############################ -# DATA BINDING -############################ --keep class **.databinding.*Binding { *; } --keep class androidx.databinding.** { *; } +# Keep Hilt entry points and components +-keep @dagger.hilt.InstallIn class * { *; } +-keep @dagger.hilt.android.AndroidEntryPoint class * { *; } +-keep @dagger.hilt.android.HiltAndroidApp class * { *; } -############################ -# FRAGMENTS -############################ --keep class * extends androidx.fragment.app.Fragment +# Keep classes annotated with @Module, @Component, @Subcomponent +-keep @dagger.Module class * { *; } +-keep @dagger.Component class * { *; } +-keep @dagger.Component.Builder class * { *; } +-keep @dagger.Subcomponent class * { *; } +-keep @dagger.Subcomponent.Builder class * { *; } -############################ -# SERIALIZABLE / PARCELABLE -############################ --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; +# Keep all classes that have @Inject constructors, fields, or methods +-keepclasseswithmembers class * { + @javax.inject.Inject (...); +} +-keepclasseswithmembers class * { + @javax.inject.Inject ; +} +-keepclasseswithmembers class * { + @javax.inject.Inject ; } -############################ -# NEXGO / SUNMI / PAYLIBS -############################ +# Keep Application class and its generated Hilt class +-keep class com.utsmm.kbz.MyApplication { *; } +-keep class com.utsmm.kbz.Hilt_MyApplication { *; } +-keep class com.utsmyanmar.baselib.BaseApplication { *; } + +# Keep main activity and its generated classes +-keep class com.utsmm.kbz.MainActivity { *; } + +# ViewModels and Repository classes (important for injection) +-keep class * extends androidx.lifecycle.ViewModel { *; } +-keep class com.utsmyanmar.baselib.repo.Repository { *; } +-keep class com.utsmyanmar.baselib.emv.EmvParamOperation { *; } +-keep class com.utsmyanmar.baselib.emv.TerminalParamOperation { *; } + +# Keep all Dagger generated classes - these are critical! +-keep class **_Factory { *; } +-keep class **_MembersInjector { *; } +-keep class **_Provide* { *; } + +-keep class com.utsmyanmar.baselib.network.model.* { ; } +-keep class com.utsmyanmar.baselib.network.model.sirius.* { ; } +-keep class com.utsmyanmar.baselib.db.model.* { ; } + +-keep class com.utsmyanmar.ecr.data.* { ; } +-keep class com.utsmyanmar.ecr.data.model.* { ; } + +-keep class com.utsmyanmar.mpulib.data.model.* { ; } + +-keep class * extends com.google.gson.TypeAdapter +-keep class * implements com.google.gson.TypeAdapterFactory +-keep class * implements com.google.gson.JsonSerializer +-keep class * implements com.google.gson.JsonDeserializer + +# this is start +-keep class org.bouncycastle.** { *; } +-keep interface org.bouncycastle.** { *; } +-keep class okhttp3.internal.platform.BouncyCastlePlatform { *; } + +# Keep classes from the JNDI package +-keep class javax.naming.** { *; } +-keep class javax.naming.directory.** { *; } + +# Keep Bouncy Castle classes +-keep class org.bouncycastle.** { *; } + +# Keep Conscrypt classes +-keep class org.conscrypt.** { *; } + +# Keep OpenJSSE classes +-keep class org.openjsse.** { *; } + +# Keep classes from okhttp3.internal.platform.BouncyCastlePlatform +-keep class okhttp3.internal.platform.BouncyCastlePlatform { *; } + +# Keep classes from okhttp3.internal.platform.ConscryptPlatform +-keep class okhttp3.internal.platform.ConscryptPlatform$Companion { *; } +#-keep class okhttp3.internal.platform.ConscryptPlatform$platformTrustManager$2 { *; } + +# Keep classes from okhttp3.internal.platform.OpenJSSEPlatform +-keep class okhttp3.internal.platform.OpenJSSEPlatform { *; } + +#this is end + +-keepclassmembers,allowobfuscation class * { + @com.google.gson.annotations.SerializedName ; + } + +-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken +-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken + + +# Jun9 2022 + +#-keep public class * implements com.bumptech.glide.module.GlideModule +#-keep class * extends com.bumptech.glide.module.AppGlideModule { +# (...); +#} +#-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { +# **[] $VALUES; +# public *; +#} + +#-assumenosideeffects class android.util.Log { +#public static int d(...); +#public static int v(...); +#public static int i(...); +#public static int w(...); +#public static int wtf(...); +# } + +-dontwarn okhttp3.internal.platform.** +-dontwarn org.conscrypt.** +-dontwarn org.bouncycastle.** +-dontwarn org.openjsse.** + +# RxJava 3 Rules - Critical for Observable chains +-keep class io.reactivex.rxjava3.** { *; } +-dontwarn io.reactivex.rxjava3.** +-keep class io.reactivex.rxjava3.core.** { *; } +-keep class io.reactivex.rxjava3.android.** { *; } +-keep class io.reactivex.rxjava3.schedulers.** { *; } + +# Retrofit and OkHttp rules +-keepattributes RuntimeVisibleAnnotations +-keep class retrofit2.** { *; } +-keepclassmembernames interface * { + @retrofit2.http.* ; +} + +# AndroidX and Lifecycle components +-keep class androidx.lifecycle.** { *; } +-keep class * extends androidx.lifecycle.ViewModel { *; } +-keep class androidx.activity.** { *; } +-keep class androidx.fragment.** { *; } + +# Navigation component rules +-keep class androidx.navigation.** { *; } +-keep class * implements androidx.navigation.NavDirections { *; } + +# DataBinding rules +-keep class androidx.databinding.** { *; } +-keep class * extends androidx.databinding.ViewDataBinding { *; } + +# Room database rules (if using Room) +-keep class androidx.room.** { *; } +-keep class * extends androidx.room.RoomDatabase { *; } + +# PayLibs and device-specific rules +-keep class com.utsmyanmar.paylibs.** { *; } -keep class com.nexgo.** { *; } -keep class com.sunmi.** { *; } --keep class com.utsmyanmar.** { *; } --keep class com.kizzy.xpay.** { *; } +-keep class com.utsmyanmar.checkxread.** { *; } +-keep class com.utsmyanmar.ecr.** { *; } +-keep class com.utsmyanmar.mpulib.** { *; } +-keep class com.utsmyanmar.baselib.** { *; } -############################ -# ENUMS (ISO / TRANSACTION TYPES) -############################ +# Enum preservation for critical enums -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -# Keep Retrofit generic signatures --keepattributes Signature --keepattributes *Annotation* +# Keep model classes from obfuscation completely +-keep class com.utsmyanmar.paylibs.model.** { *; } +-keep class com.utsmyanmar.baselib.db.model.** { *; } -# RxJava --keep class io.reactivex.** { *; } --dontwarn io.reactivex.** - -# Retrofit --keep class retrofit2.** { *; } --dontwarn retrofit2.** - -# Your API interfaces --keep interface com.utsmyanmar.baselib.api.** { *; } - -# Your response models --keep class com.utsmyanmar.baselib.model.** { *; } - -# Keep model fields for Gson --keepclassmembers class * { - @com.google.gson.annotations.SerializedName ; +# Critical: Keep all native methods and JNI classes +-keepclasseswithmembernames class * { + native ; } -# Or keep all models directly (simpler & safer) --keep class com.utsmyanmar.baselib.model.** { *; } +# Keep critical system params and utils +-keep class com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation { *; } +-keep class com.utsmyanmar.paylibs.utils.** { *; } --keep class androidx.lifecycle.** { *; } --keep class * extends androidx.lifecycle.ViewModel { *; } --keep class com.utsmyanmar.baselib.repo.** { *; } \ No newline at end of file +# Prevent obfuscation of classes used in reflection +-keep class * extends java.lang.Exception +-keep class * extends java.lang.Error + +# CRITICAL: Keep all generated application components from obfuscation +-keep class com.utsmm.kbz.MyApplication_GeneratedInjector { *; } +#-keep class com.utsmm.kbz.MyApplication_HiltComponents$SingletonC { *; } +#-keep class com.utsmm.kbz.MyApplication_HiltComponents { *; } + +# Keep all classes with "Generated" in their name (Hilt generates these) +-keep class **_Generated { *; } +-keep class **GeneratedInjector { *; } + +# Additional protection for the specific classes causing crashes +-keep class **.D0.h { *; } +-keep class **.m2.f { *; } +-keep class **.J3.b { *; } + +# Keep everything in the di package to prevent injection failures +-keep class com.utsmyanmar.baselib.di.** { *; } +-keep class com.utsmm.kbz.di.** { *; } + +# Hilt Extension points +#-keep class * extends dagger.hilt.android.internal.managers.ApplicationComponentManager$ApplicationComponentBuilder { *; } + +# Don't obfuscate any annotation processing related classes +-keep class dagger.internal.** { *; } +-keepnames class dagger.internal.** { *; } + +# Keep annotation-based bindings +-keep @javax.inject.Inject class * { *; } +-keep @dagger.Provides class * { *; } +-keep @dagger.Module class * { *; } \ No newline at end of file diff --git a/baselib/proguard-rules.pro b/baselib/proguard-rules.pro index 4af0639..8cef902 100644 --- a/baselib/proguard-rules.pro +++ b/baselib/proguard-rules.pro @@ -27,4 +27,29 @@ -keep class com.android.org.bouncycastle.** { *; } -dontwarn com.android.org.bouncycastle.** --keep class org.bouncycastle.** {*;} \ No newline at end of file +-keep class org.bouncycastle.** {*;} + +-keepclassmembers,allowobfuscation class * { + @com.google.gson.annotations.SerializedName ; +} + +# Hilt support for baselib +-keep class com.utsmyanmar.baselib.di.** { *; } +-keep class com.utsmyanmar.baselib.emv.EmvParamOperation { *; } +-keep class com.utsmyanmar.baselib.emv.TerminalParamOperation { *; } +-keep class com.utsmyanmar.baselib.repo.Repository { *; } + +# Keep all Hilt generated classes in baselib +-keep class **_HiltModules { *; } +-keep class **_HiltModules$* { *; } + +# Keep classes with @Inject annotations +-keepclasseswithmembers class * { + @javax.inject.Inject (...); +} +-keepclasseswithmembers class * { + @javax.inject.Inject ; +} +-keepclasseswithmembers class * { + @javax.inject.Inject ; +} \ No newline at end of file diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/emv/EmvAppConfig.java b/baselib/src/main/java/com/utsmyanmar/baselib/emv/EmvAppConfig.java index 48c5621..9165a91 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/emv/EmvAppConfig.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/emv/EmvAppConfig.java @@ -1,6 +1,5 @@ package com.utsmyanmar.baselib.emv; -import com.sunmi.pay.hardware.aidlv2.bean.AidV2; import com.utsmyanmar.baselib.db.model.ContactlessAid; import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil; diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java index 0b2abd8..af1d087 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -225,7 +225,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { // transData.setCashbackAmount("000000000100"); //if support cashback amount transData.setEmvTransType(ByteUtil.hexStr2Byte(getTransactionType())); //0x00-sale, 0x20-refund,0x09-sale with cashback transData.setCountryCode("104"); //CountryCode - transData.setCurrencyCode("104"); //CurrencyCode, 840 indicate USD dollar + transData.setCurrencyCode(mPayDetail.getCurrencyCode()); //CurrencyCode, 840 indicate USD dollar transData.setTermId(mPayDetail.getTerminalNo()); transData.setMerId(mPayDetail.getMerchantNo()); transData.setTransDate(new SimpleDateFormat("yyMMdd", Locale.getDefault()).format(new Date())); diff --git a/paylibs/proguard-rules.pro b/paylibs/proguard-rules.pro index 481bb43..b469731 100644 --- a/paylibs/proguard-rules.pro +++ b/paylibs/proguard-rules.pro @@ -18,4 +18,22 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +# Keep the JNDI classes +-keep class javax.naming.** { *; } +-keep class javax.naming.directory.** { *; } + +# Keep the Bouncy Castle classes +-keep class org.bouncycastle.** { *; } + +# Keep the Conscrypt classes +-keep class org.conscrypt.** { *; } + +# Keep the OpenJSSE classes +-keep class org.openjsse.** { *; } + +# Keep specific classes from okhttp3.internal.platform +-keep class okhttp3.internal.platform.BouncyCastlePlatform { *; } +-keep class okhttp3.internal.platform.ConscryptPlatform { *; } +-keep class okhttp3.internal.platform.OpenJSSEPlatform { *; } \ No newline at end of file From 5b749073d02f25255a4e00e555a901bbf8b6542b Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Tue, 13 Jan 2026 11:09:55 +0630 Subject: [PATCH 05/16] update rules for printer crash --- app/proguard-rules.pro | 18 +++++++++++++++++- paylibs/proguard-rules.pro | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 3b9d0f5..91cbd61 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -249,4 +249,20 @@ # Keep annotation-based bindings -keep @javax.inject.Inject class * { *; } -keep @dagger.Provides class * { *; } --keep @dagger.Module class * { *; } \ No newline at end of file +-keep @dagger.Module class * { *; } + +# Keep Nexgo SDK +-keep class com.nexgo.** { *; } + +# Keep DDI interface (VERY IMPORTANT) +-keep class com.xinguodu.ddiinterface.** { *; } + +# Keep printer implementations +-keep class com.nexgo.oaf.apiv3.device.printer.** { *; } + +# Prevent method shrinking/optimization +-dontoptimize +-dontshrink + +-dontwarn com.xgd.smartpos.manager.app.UsageInfo +-dontwarn com.xgd.smartpos.manager.app.UsageStats \ No newline at end of file diff --git a/paylibs/proguard-rules.pro b/paylibs/proguard-rules.pro index b469731..b81aa11 100644 --- a/paylibs/proguard-rules.pro +++ b/paylibs/proguard-rules.pro @@ -36,4 +36,20 @@ # Keep specific classes from okhttp3.internal.platform -keep class okhttp3.internal.platform.BouncyCastlePlatform { *; } -keep class okhttp3.internal.platform.ConscryptPlatform { *; } --keep class okhttp3.internal.platform.OpenJSSEPlatform { *; } \ No newline at end of file +-keep class okhttp3.internal.platform.OpenJSSEPlatform { *; } + +# Keep Nexgo SDK +-keep class com.nexgo.** { *; } + +# Keep DDI interface (VERY IMPORTANT) +-keep class com.xinguodu.ddiinterface.** { *; } + +# Keep printer implementations +-keep class com.nexgo.oaf.apiv3.device.printer.** { *; } + +# Prevent method shrinking/optimization +-dontoptimize +-dontshrink + +-dontwarn com.xgd.smartpos.manager.app.UsageInfo +-dontwarn com.xgd.smartpos.manager.app.UsageStats \ No newline at end of file From c9dd1b93f71c30258a27638c22dd245189e17d48 Mon Sep 17 00:00:00 2001 From: kizzy Date: Mon, 12 Jan 2026 14:47:20 +0700 Subject: [PATCH 06/16] optimized refund --- .../main/java/com/utsmm/kbz/MainActivity.java | 30 +++++++++++++++++++ .../kbz/ui/core_ui/InputPasswordFragment.java | 2 +- .../kbz/ui/core_ui/InputRRNFragment.java | 8 ++--- .../kbz/ui/core_ui/ProcessingFragment.java | 8 ++--- .../utsmyanmar/baselib/TerminalKeyUtil.java | 10 +++---- .../paylibs/sign_on/SignOnProcess.java | 3 +- .../core_utils/SystemParamsOperation.java | 26 +++++++++++++--- .../core_utils/SystemParamsSettings.java | 7 +++-- 8 files changed, 72 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/MainActivity.java b/app/src/main/java/com/utsmm/kbz/MainActivity.java index 7d8a78e..350e7b4 100644 --- a/app/src/main/java/com/utsmm/kbz/MainActivity.java +++ b/app/src/main/java/com/utsmm/kbz/MainActivity.java @@ -16,6 +16,8 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.text.TextUtils; import android.view.Gravity; import android.view.WindowManager; @@ -28,6 +30,8 @@ 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.device.pinpad.PinPad; +import com.nexgo.oaf.apiv3.device.pinpad.WorkKeyTypeEnum; import com.utsmyanmar.baselib.BaseApplication; import com.utsmyanmar.baselib.repo.Repository; import com.utsmyanmar.baselib.ui.AnimationDialog; @@ -38,6 +42,7 @@ import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.print.printx.PrintXReceipt; import com.utsmyanmar.paylibs.utils.POSUtil; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; +import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsSettings; import com.utsmyanmar.paylibs.utils.enums.TransMenu; import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType; import com.utsmm.kbz.databinding.ActivityMainNewBinding; @@ -134,8 +139,33 @@ public class MainActivity extends AppCompatActivity implements // Initialize special back handling fragments initSpecialBackHandlingFragments(); + + final Handler handler = new Handler(Looper.getMainLooper()); + handler.postDelayed(new Runnable() { + @Override + public void run() { + initKey(); + } + }, 500); + } + private void initKey(){ +// SystemParamsOperation.getInstance().setTmsAddress("https://api-tms-uat.kbzbank.com:8443/sirius"); +// SystemParamsOperation.getInstance().setTmsAddress("http://sirius-nest.utsmyanmar.com"); +// SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms-uat.kbzbank.com:8443/receipt"); +// SystemParamsOperation.getInstance().setEReceiptAddress("http://receipt-nest.utsmyanmar.com"); + + PinPad pinPad = MyApplication.getInstance().deviceEngine.getPinPad(); + byte[] encryptedPIK = SystemParamsOperation.getInstance().getPIK(); + + if (encryptedPIK != null && encryptedPIK.length != 0) { + int result = pinPad.writeWKey(9, WorkKeyTypeEnum.PINKEY, encryptedPIK, encryptedPIK.length); + LogUtil.d(TAG, "save PIK key result: "+result); + } else { + LogUtil.d(TAG, "There's no PIK key!"); + } + } private void initViewModels() { diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputPasswordFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputPasswordFragment.java index 0a0121b..75ca1dc 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputPasswordFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputPasswordFragment.java @@ -176,7 +176,7 @@ public class InputPasswordFragment extends DataBindingFragment implements DataBi break; case REFUND: inputPasswordViewModel.passwordType.setValue(InputPasswordType.SYSTEM); - routeId = R.id.action_inputPasswordFragment_to_selectRefundFragment; + routeId = R.id.action_inputPasswordFragment_to_inputAmountFragment; break; case PRE_AUTH_COMPLETE: inputPasswordViewModel.passwordType.setValue(InputPasswordType.SYSTEM); diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputRRNFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputRRNFragment.java index 849b170..cd5a1ae 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputRRNFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/InputRRNFragment.java @@ -526,7 +526,7 @@ public class InputRRNFragment extends DataBindingFragment { String date = payDetail.getTransDate(); String time = payDetail.getTransTime(); - if(checkRefund(configTime,date,time)) { +// if(checkRefund(configTime,date,time)) { PayDetail newPay = transProcessViewModel.getPayDetail(); newPay.setReferNo(rrnNo); @@ -537,9 +537,9 @@ public class InputRRNFragment extends DataBindingFragment { callNextScreen(); - } else { - terminatedTransRefund(isECR); - } +// } else { +// terminatedTransRefund(isECR); +// } } else { diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java index 5250ac9..734e511 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/ProcessingFragment.java @@ -179,10 +179,10 @@ public class ProcessingFragment extends DataBindingFragment { } - if(sharedViewModel.payDetail.getValue() != null) { - EReceiptRequest request = EReceiptUtil.getInstance().generateMPUReceipt(sharedViewModel.payDetail.getValue()); - sharedViewModel.pushReceipt(request); - } +// if(sharedViewModel.payDetail.getValue() != null) { +// EReceiptRequest request = EReceiptUtil.getInstance().generateMPUReceipt(sharedViewModel.payDetail.getValue()); +// sharedViewModel.pushReceipt(request); +// } // transProcessViewModel.payDetailResult.observe(getViewLifecycleOwner(), payDetail -> sharedViewModel.payDetail.postValue(payDetail)); } diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java index 2fe0576..f2880e8 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java @@ -51,11 +51,11 @@ public final class TerminalKeyUtil { LogUtil.d(TAG, "save tmk key result: "+result); - byte[] encryptedPIK = SystemParamsOperation.getInstance().getKeyPIK().get(0); - - result = pinPad.writeWKey(9, WorkKeyTypeEnum.PINKEY,encryptedPIK,encryptedPIK.length); - - LogUtil.d(TAG, "save PIK key result: "+result); +// byte[] encryptedPIK = SystemParamsOperation.getInstance().getKeyPIK().get(0); +// +// result = pinPad.writeWKey(9, WorkKeyTypeEnum.PINKEY,encryptedPIK,encryptedPIK.length); +// +// LogUtil.d(TAG, "save PIK key result: "+result); // LogUtil.d(TAG, "save pin key result: "+resultPINKEY); // LogUtil.d(TAG, "save tdk key result: "+resultTDKEY); // LogUtil.d(TAG, "save tek key result: "+resultTEK); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/sign_on/SignOnProcess.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/sign_on/SignOnProcess.java index 130bbc1..d2c3d3f 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/sign_on/SignOnProcess.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/sign_on/SignOnProcess.java @@ -117,7 +117,7 @@ public class SignOnProcess { } LogUtil.d(TAG, "TMK Index:" + tmkIndex); - SystemParamsOperation.getInstance().saveKeyPIK(encryptedPIK, kcv); + SystemParamsOperation.getInstance().savePIK(encryptedPIK); int res = PayLibNex.getInstance().deviceEngine.getPinPad().writeWKey(tmkIndex, WorkKeyTypeEnum.PINKEY,encryptedPIK,encryptedPIK.length); // int res = PayLibsUtils.getInstance().securityOptV2.saveCiphertextKey(AidlConstantsV2.Security.KEY_TYPE_PIK, encryptedPIK, null, tmkIndex, AidlConstantsV2.Security.KEY_ALG_TYPE_3DES, 11); @@ -165,6 +165,7 @@ public class SignOnProcess { tmkIndex = Integer.parseInt(SystemParamsOperation.getInstance().getTMKIndex()); } + SystemParamsOperation.getInstance().savePIK(encryptedPIK); LogUtil.d(TAG, "TMK Index:" + tmkIndex); int res = PayLibNex.getInstance().deviceEngine.getPinPad().writeWKey(tmkIndex, WorkKeyTypeEnum.PINKEY,encryptedPIK,encryptedPIK.length); // int res = PayLibsUtils.getInstance().securityOptV2.saveCiphertextKey(AidlConstantsV2.Security.KEY_TYPE_PIK, encryptedPIK, null, tmkIndex, AidlConstantsV2.Security.KEY_ALG_TYPE_3DES, 11); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsOperation.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsOperation.java index f72c6ee..806f754 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsOperation.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/utils/core_utils/SystemParamsOperation.java @@ -1,6 +1,7 @@ package com.utsmyanmar.paylibs.utils.core_utils; import android.text.TextUtils; +import android.util.Base64; import java.util.ArrayList; import java.util.Locale; @@ -1046,22 +1047,34 @@ public class SystemParamsOperation { saveSystemParamsSettings(params); } - public void saveKeyPIK(byte[] pikValue,byte[] pikKcv){ + + + public void savePIK(byte[] pikValue){ SystemParamsSettings params = getSystemParamsSettings(); - params.setPik_value(pikValue); - params.setPik_kcv(pikKcv); + + String pikString = Base64.encodeToString(pikValue, Base64.DEFAULT); + + params.setPik_value(pikString); saveSystemParamsSettings(params); } public ArrayList getKeyPIK(){ SystemParamsSettings params = getSystemParamsSettings(); ArrayList arrayList = new ArrayList<>(); - arrayList.add(params.getPik_value()); +// arrayList.add(params.getPik_value()); arrayList.add(params.getPik_kcv()); return arrayList; } + public byte[] getPIK(){ + SystemParamsSettings params = getSystemParamsSettings(); +// return params.getPik_value(); + if(params.getPik_value() != null) + return Base64.decode(params.getPik_value(), Base64.DEFAULT); + else + return null; + } public void setConnectStatus(boolean status){ SystemParamsSettings params = getSystemParamsSettings(); params.setConnect_status(status); @@ -1656,6 +1669,11 @@ public class SystemParamsOperation { return params.getCertificatePassword(); } + public void setEReceiptAddress(String url) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setEreceiptAddress(url); + saveSystemParamsSettings(params); + } public String getEreceiptAddress() { SystemParamsSettings params = getSystemParamsSettings(); return params.getEreceiptAddress(); 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 d887c91..699f293 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 @@ -243,7 +243,8 @@ public class SystemParamsSettings implements Serializable { private boolean nfcEnabled = false; - private byte[] pik_value; + private String pik_value; + private byte[] pik_kcv; @@ -819,7 +820,7 @@ public class SystemParamsSettings implements Serializable { this.batchNumStart = batchNumStart; } - protected byte[] getPik_value() { + protected String getPik_value() { return pik_value; } @@ -827,7 +828,7 @@ public class SystemParamsSettings implements Serializable { return pik_kcv; } - protected void setPik_value(byte[] pik_value) { + protected void setPik_value(String pik_value) { this.pik_value = pik_value; } From 58118a2fb5469fb33483248de8a55c6924e46821 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Tue, 13 Jan 2026 23:34:12 +0630 Subject: [PATCH 07/16] production ready --- .idea/deploymentTargetSelector.xml | 6 --- app/build.gradle | 30 +------------ .../main/java/com/utsmm/kbz/MainActivity.java | 24 ++++++---- .../main/java/com/utsmm/kbz/MainFragment.java | 6 +-- .../layout/fragment_print_receipt_screen.xml | 45 +++++++++++++++++-- .../utsmyanmar/baselib/di/NetworkModule.java | 22 ++++++--- .../baselib/network/KPayApiService.java | 4 +- .../interceptor/SiriusInterceptor.java | 2 +- .../utsmyanmar/baselib/repo/Repository.java | 4 +- .../paylibs/print/printx/BaseXPrint.java | 2 +- 10 files changed, 85 insertions(+), 60 deletions(-) diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index da6c8f6..a7ec23d 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -13,12 +13,6 @@ - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index a168be9..d6b3ef3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,34 +47,6 @@ android { } } -// defaultConfig { -// applicationId "com.utsmm.kbz.sit" -// minSdk 24 -// targetSdk 33 -// versionCode 1 -// versionName "1.0" -// -//// applicationId "com.utsmm.kbz" -//// versionName "1.10" -// -// testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" -// -//// // Add CMake configuration -//// externalNativeBuild { -//// cmake { -//// cppFlags "-std=c++14" -//// } -//// } -// } - - // Configure CMake -// externalNativeBuild { -// cmake { -// path "src/main/cpp/CMakeLists.txt" -// version "3.22.1" -// } -// } - buildTypes { release { minifyEnabled true @@ -82,7 +54,7 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } debug { - debuggable true + debuggable false } } compileOptions { diff --git a/app/src/main/java/com/utsmm/kbz/MainActivity.java b/app/src/main/java/com/utsmm/kbz/MainActivity.java index 350e7b4..6e32616 100644 --- a/app/src/main/java/com/utsmm/kbz/MainActivity.java +++ b/app/src/main/java/com/utsmm/kbz/MainActivity.java @@ -110,6 +110,8 @@ public class MainActivity extends AppCompatActivity implements public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar(); + // Keep screen on getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); @@ -147,7 +149,6 @@ public class MainActivity extends AppCompatActivity implements initKey(); } }, 500); - } private void initKey(){ @@ -426,15 +427,15 @@ public class MainActivity extends AppCompatActivity implements SystemParamsOperation.getInstance().setDownloadedParams(false); handleAutoSettlementIntent(getIntent()); - + BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar(); } @Override public void onStop(){ super.onStop(); - BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); - BaseApplication.getInstance().deviceEngine.getPlatform().enableHomeButton(); - BaseApplication.getInstance().deviceEngine.getPlatform().enableTaskButton(); +// BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); +// BaseApplication.getInstance().deviceEngine.getPlatform().enableHomeButton(); +// BaseApplication.getInstance().deviceEngine.getPlatform().enableTaskButton(); } @Override @@ -502,14 +503,15 @@ public class MainActivity extends AppCompatActivity implements @Override public void onDestroy() { super.onDestroy(); - BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); - BaseApplication.getInstance().deviceEngine.getPlatform().enableHomeButton(); - BaseApplication.getInstance().deviceEngine.getPlatform().enableTaskButton(); +// BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); +// BaseApplication.getInstance().deviceEngine.getPlatform().enableHomeButton(); +// BaseApplication.getInstance().deviceEngine.getPlatform().enableTaskButton(); // Clean up RxJava disposables compositeDisposable.clear(); // Reset screen mode // Disconnect ECR ECRHelper.INSTANCE.disconnect(); + BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); } // Navigation drawer interaction listeners @@ -520,6 +522,12 @@ public class MainActivity extends AppCompatActivity implements navController.navigate(R.id.inputPasswordFragment); } + @Override + public void onPause(){ + super.onPause(); + BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); + } + @Override public void onClickFunction() { closeDrawer(); diff --git a/app/src/main/java/com/utsmm/kbz/MainFragment.java b/app/src/main/java/com/utsmm/kbz/MainFragment.java index d6fcdc7..ee03da5 100644 --- a/app/src/main/java/com/utsmm/kbz/MainFragment.java +++ b/app/src/main/java/com/utsmm/kbz/MainFragment.java @@ -146,10 +146,10 @@ public class MainFragment extends DataBindingFragment { delayFunctionCall(() -> { NexGoSDK.getInstance().cancelCheckCard(); NexGoSDK.getInstance().closeReader(); - enableHomeButton(); - disableTaskButton(); +// enableHomeButton(); +// disableTaskButton(); // BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar(); - BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); +// BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); }); } diff --git a/app/src/main/res/layout/fragment_print_receipt_screen.xml b/app/src/main/res/layout/fragment_print_receipt_screen.xml index 5dcc23c..b751701 100644 --- a/app/src/main/res/layout/fragment_print_receipt_screen.xml +++ b/app/src/main/res/layout/fragment_print_receipt_screen.xml @@ -223,6 +223,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:maxLines="1" + android:ellipsize="end" + + tools:text="REF123456789123456789123456789012345" /> + 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 51102e2..7870b12 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java @@ -82,9 +82,6 @@ public class NetworkModule { public static native String getTMSUrlFromNative(); - public static String Refund_Base_Url = "https://api.kbzpay.com:18008/payment/gateway/uat/"; - - private static OkHttpClient getUnsafeOkHttpClient() { try { // Create a trust manager that does not validate certificate chains @@ -395,6 +392,21 @@ public Retrofit provideKPayRefundRetrofit(@ApplicationContext Context context) { // char[] password = "test123".toCharArray(); +// public static String Refund_Base_Url = "https://api.kbzpay.com:18008/payment/gateway/uat/"; + + + String refundBaseUrl = ""; + String IpAddress = SystemParamsOperation.getInstance().getSecHostIpAddress(); + + + if (IpAddress != null && !IpAddress.isEmpty()) { + refundBaseUrl = IpAddress; + } + + if (refundBaseUrl.isEmpty()) { + refundBaseUrl = "https://api.kbzpay.com/payment/gateway/"; + } + String pass = SystemParamsOperation.getInstance().getCertificatePassword(); if (TextUtils.isEmpty(pass)) { pass = "test123"; @@ -456,7 +468,7 @@ public Retrofit provideKPayRefundRetrofit(@ApplicationContext Context context) { .build(); return new Retrofit.Builder() - .baseUrl(Refund_Base_Url) + .baseUrl(refundBaseUrl) .client(okHttp) .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) @@ -468,7 +480,7 @@ public Retrofit provideKPayRefundRetrofit(@ApplicationContext Context context) { // Provide fallback Retrofit to avoid crash, but no SSL return new Retrofit.Builder() - .baseUrl(Refund_Base_Url) + .baseUrl(refundBaseUrl) .client(new OkHttpClient()) .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/network/KPayApiService.java b/baselib/src/main/java/com/utsmyanmar/baselib/network/KPayApiService.java index 7a22441..e73bf23 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/network/KPayApiService.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/network/KPayApiService.java @@ -24,8 +24,8 @@ public interface KPayApiService { //this accept "url" bez this api start with https and other are http in uat - @POST - Observable closeOrder(@Url String url, @Body KPayQRRequest.CloseOrderRequest closeOrderRequest); + @POST("closeorder") + Observable closeOrder(@Body KPayQRRequest.CloseOrderRequest closeOrderRequest); //this 2 is for production diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/network/interceptor/SiriusInterceptor.java b/baselib/src/main/java/com/utsmyanmar/baselib/network/interceptor/SiriusInterceptor.java index 7486d67..3cec79c 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/network/interceptor/SiriusInterceptor.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/network/interceptor/SiriusInterceptor.java @@ -40,7 +40,7 @@ public class SiriusInterceptor implements Interceptor { // hashed = TerminalUtil.getInstance().generateHashedString(nonce); // old tms hashed = TerminalUtil.getInstance().generateHashedString(nonce).toLowerCase(); // new tms - LogUtil.d(TAG,"hashed :"+ hashed); +// LogUtil.d(TAG,"hashed :"+ hashed); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } 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 4654e73..9368257 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java @@ -86,8 +86,8 @@ public class Repository { } public Observable qrCloseOrder(KPayQRRequest.CloseOrderRequest request){ - String url = "https://api.kbzpay.com/payment/gateway/uat/closeorder"; //close this in prod - return kPayApiService.closeOrder(url, request); +// String url = "https://api.kbzpay.com/payment/gateway/uat/closeorder"; //close this in prod + return kPayApiService.closeOrder(request); // return kPayApiService.closeOrder(request); //this is for prod } diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index a24aa96..05eaf78 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -895,7 +895,7 @@ public abstract class BaseXPrint { dashBreak(); print2ColumnsString("Sale Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount)); dashBreak(); - print2ColumnsString("Sale Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount - refundTotal)); + print2ColumnsString("Grand Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount - refundTotal)); dashBreakEnding(); // emptyLine(2); From 98c94ec2d305ff28ccff82448b41d86b91cea546 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Wed, 14 Jan 2026 11:45:03 +0630 Subject: [PATCH 08/16] refund url --- .../utsmyanmar/baselib/di/NetworkModule.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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 7870b12..c310dcf 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java @@ -254,7 +254,7 @@ public class NetworkModule { } if (baseUrl.isEmpty()) { - baseUrl = "http://api.kbzpay.com/payment/gateway/uat/"; + baseUrl = "https://api.kbzpay.com/payment/gateway/"; } return new Retrofit.Builder() .baseUrl(baseUrl) @@ -395,17 +395,17 @@ public Retrofit provideKPayRefundRetrofit(@ApplicationContext Context context) { // public static String Refund_Base_Url = "https://api.kbzpay.com:18008/payment/gateway/uat/"; - String refundBaseUrl = ""; - String IpAddress = SystemParamsOperation.getInstance().getSecHostIpAddress(); + String refundBaseUrl = "https://api.kbzpay.com:8008/payment/gateway/"; +// String IpAddress = SystemParamsOperation.getInstance().getSecHostIpAddress(); - if (IpAddress != null && !IpAddress.isEmpty()) { - refundBaseUrl = IpAddress; - } - - if (refundBaseUrl.isEmpty()) { - refundBaseUrl = "https://api.kbzpay.com/payment/gateway/"; - } +// if (IpAddress != null && !IpAddress.isEmpty()) { +// refundBaseUrl = IpAddress; +// } +// +// if (refundBaseUrl.isEmpty()) { +// refundBaseUrl = "https://api.kbzpay.com/payment/gateway/"; +// } String pass = SystemParamsOperation.getInstance().getCertificatePassword(); if (TextUtils.isEmpty(pass)) { From 042fe6307edc49f18223f1cc7c0ef7e0f11efcaa Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 15 Jan 2026 20:11:00 +0630 Subject: [PATCH 09/16] log clean --- .../src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java | 2 +- .../src/main/java/com/utsmyanmar/baselib/repo/Repository.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 c310dcf..da63a03 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/di/NetworkModule.java @@ -288,7 +288,7 @@ public class NetworkModule { } // String baseUrl = tmsAddress.trim() + "/api/v1/"; //for on prim - String baseUrl = tmsAddress.trim() + "/"; //for uat + String baseUrl = tmsAddress.trim() + "/"; //for uat and prod final Gson gson = new GsonBuilder().create(); 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 9368257..d1a2040 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java @@ -120,7 +120,7 @@ public class Repository { } public Observable sendReceipt(Object body){ String apiSecret = BuildConfig.ERECEIPT_SECRET; - LogUtil.d("kmk", "receipt secret =>" + apiSecret); +// LogUtil.d("kmk", "receipt secret =>" + apiSecret); String timestamp = String.valueOf(System.currentTimeMillis()); String bodyString = new Gson().toJson(body); String dataToHash = bodyString + apiSecret + timestamp; From e4ea98f6e6d7aec6063732d2df6df6fe040d3e0e Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 15 Jan 2026 20:11:06 +0630 Subject: [PATCH 10/16] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7cf1c63..856177e 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ local.properties /app/uat/release/* /app/uat /.idea +/app/prod/release From fe97613f9bb1972cb2f7b1ada81b2c67dbc09be6 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 15 Jan 2026 23:56:26 +0630 Subject: [PATCH 11/16] inv num to trc num in qr --- .../main/java/com/utsmm/kbz/ui/adapters/MyBindingAdapter.java | 4 +++- app/src/main/res/layout/fragment_qr_refund.xml | 2 +- .../res/layout/fragment_transaction_reprint_any_screen.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/adapters/MyBindingAdapter.java b/app/src/main/java/com/utsmm/kbz/ui/adapters/MyBindingAdapter.java index b075986..366cc31 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/adapters/MyBindingAdapter.java +++ b/app/src/main/java/com/utsmm/kbz/ui/adapters/MyBindingAdapter.java @@ -296,7 +296,9 @@ public class MyBindingAdapter { @BindingAdapter({"isTrace"}) public static void checkIsTraceOrInvoice(TextView textView, PayDetail payDetail) { if(payDetail.getTransactionType() == TransactionsType.MMQR.value || payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value) { - textView.setText("INV:"+payDetail.getInvoiceNo()); +// textView.setText("INV:"+payDetail.getInvoiceNo()); + //tempo fix for qr trace num + textView.setText("TRC:"+payDetail.getVoucherNo()); } else { textView.setText("TRC:"+payDetail.getVoucherNo()); } diff --git a/app/src/main/res/layout/fragment_qr_refund.xml b/app/src/main/res/layout/fragment_qr_refund.xml index dfc84ea..83d37c6 100644 --- a/app/src/main/res/layout/fragment_qr_refund.xml +++ b/app/src/main/res/layout/fragment_qr_refund.xml @@ -71,7 +71,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:background="@null" - android:hint="@string/txt_search_rrn_trace" + android:hint="@string/txt_search_by_trace" android:text="@={manageViewModel.txtRRNTrace}" android:textColor="@color/colorPrimary" android:textColorHint="@color/colorPrimary" diff --git a/app/src/main/res/layout/fragment_transaction_reprint_any_screen.xml b/app/src/main/res/layout/fragment_transaction_reprint_any_screen.xml index 271bcca..a9a52c8 100644 --- a/app/src/main/res/layout/fragment_transaction_reprint_any_screen.xml +++ b/app/src/main/res/layout/fragment_transaction_reprint_any_screen.xml @@ -118,7 +118,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:background="@null" - android:hint="@string/txt_search_rrn_trace" + android:hint="@string/txt_search_by_trace" android:textColorHint="@color/colorPrimary" android:alpha="0.6" android:text="@={manageViewModel.txtRRNTrace}" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4069bc7..3b885f3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -615,5 +615,6 @@ Total QR Transactions No QR transactions to settle Confirm + Search By Trace No \ No newline at end of file From 0ad0bc17b75500e9af8eb4b8a6c40867899b8cbf Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 15 Jan 2026 23:57:04 +0630 Subject: [PATCH 12/16] keyboard auto hide and search by trace no fix --- .../ReprintAnyTransactionFragment.java | 13 ++---- .../kbz/ui/qr_pay/QRRefundDetailFragment.java | 2 + .../utsmm/kbz/ui/qr_pay/QRRefundFragment.java | 13 +++--- .../utsmm/kbz/util/helper/KeyboardHelper.java | 44 +++++++++++++++++++ 4 files changed, 55 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/com/utsmm/kbz/util/helper/KeyboardHelper.java diff --git a/app/src/main/java/com/utsmm/kbz/ui/management/ReprintAnyTransactionFragment.java b/app/src/main/java/com/utsmm/kbz/ui/management/ReprintAnyTransactionFragment.java index a001d97..bb15a74 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/management/ReprintAnyTransactionFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/management/ReprintAnyTransactionFragment.java @@ -10,6 +10,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.utsmm.kbz.ui.kpay.KPayViewModel; +import com.utsmm.kbz.util.helper.KeyboardHelper; import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.network.model.KPayQRQueryRequest; import com.utsmyanmar.baselib.util.DataBindingConfig; @@ -128,7 +129,7 @@ public class ReprintAnyTransactionFragment extends DataBindingFragment { private void searchByTrace(String trace) { for (PayDetail s : lists) { - if(s.getVoucherNo().equals(trace)) { + if(s.getVoucherNo().contains(trace)) { searchedLists.add(s); } } @@ -151,19 +152,13 @@ public class ReprintAnyTransactionFragment extends DataBindingFragment { String input = managementViewModel.txtRRNTrace.getValue(); if(input != null && !input.isEmpty()) { - if(input.length() == 6) { - searchByTrace(input); - } else if(input.length() == 12) { - searchByRRN(input); - } + searchByTrace(input); } else { - searchedLists.addAll(lists); } cardViewAdapter.updateList(searchedLists); - - + KeyboardHelper.hide(requireActivity()); } } diff --git a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundDetailFragment.java b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundDetailFragment.java index 53583c0..552ce2d 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundDetailFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundDetailFragment.java @@ -13,6 +13,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.utsmm.kbz.ui.kpay.KPayViewModel; +import com.utsmm.kbz.util.helper.KeyboardHelper; import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.paylibs.model.PayDetail; @@ -225,6 +226,7 @@ public class QRRefundDetailFragment extends DataBindingFragment { sharedViewModel.transactionsType.setValue(TransactionsType.MMQR_REFUND); kPayViewModel.setPayDetail(payDetail); // sharedViewModel.amount.setValue(refundAmountStr); + KeyboardHelper.hide(requireActivity()); routeId = R.id.action_qrRefundDetail_inputPasswordFragment; safeNavigateToRouteId(); } diff --git a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundFragment.java b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundFragment.java index 1a376c7..a0813e1 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/qr_pay/QRRefundFragment.java @@ -19,6 +19,7 @@ import com.utsmm.kbz.R; import com.utsmm.kbz.config.Constants; import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel; import com.utsmm.kbz.ui.kpay.KPayViewModel; +import com.utsmm.kbz.util.helper.KeyboardHelper; import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.paylibs.model.PayDetail; @@ -107,7 +108,8 @@ public class QRRefundFragment extends DataBindingFragment { safeNavigateToRouteId(); } public void onSearch(){ - searchById(); + searchByTrace(); + KeyboardHelper.hide(requireActivity()); } } @@ -118,7 +120,7 @@ public class QRRefundFragment extends DataBindingFragment { NavHostFragment.findNavController(this).navigate(routeId, bundle); } - private void searchById(){ + private void searchByTrace(){ EditText editText = getView().findViewById(R.id.rnn_trace_id); String keyword = editText.getText().toString().trim(); @@ -132,12 +134,7 @@ public class QRRefundFragment extends DataBindingFragment { List filteredList = new ArrayList<>(); for(PayDetail item: originalList){ - - boolean match = - (item.getReferNo() != null && item.getReferNo().contains(keyword)) || - (item.getInvoiceNo() != null && item.getInvoiceNo().contains(keyword)) || - (item.getVoucherNo() != null && item.getVoucherNo().contains(keyword)); - + boolean match = item.getVoucherNo() != null && item.getVoucherNo().contains(keyword); if(match){ filteredList.add(item); } diff --git a/app/src/main/java/com/utsmm/kbz/util/helper/KeyboardHelper.java b/app/src/main/java/com/utsmm/kbz/util/helper/KeyboardHelper.java new file mode 100644 index 0000000..1de832b --- /dev/null +++ b/app/src/main/java/com/utsmm/kbz/util/helper/KeyboardHelper.java @@ -0,0 +1,44 @@ +package com.utsmm.kbz.util.helper; + +import android.app.Activity; +import android.content.Context; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +public class KeyboardHelper { + + private KeyboardHelper() { + // no instance + } + + /** Hide keyboard using a View (Fragment-safe) */ + public static void hide(Context context, View view) { + if (context == null || view == null) return; + + InputMethodManager imm = + (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + + if (imm != null) { + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + view.clearFocus(); + } + } + + /** Hide keyboard using Activity (Activity-safe) */ + public static void hide(Activity activity) { + if (activity == null) return; + + View view = activity.getCurrentFocus(); + if (view == null) { + view = activity.getWindow().getDecorView(); + } + + InputMethodManager imm = + (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); + + if (imm != null) { + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + view.clearFocus(); + } + } +} From ce32ed232775f91c209aba812371daca3a2ecea8 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Thu, 15 Jan 2026 23:57:31 +0630 Subject: [PATCH 13/16] INV NO to TRACE NO --- .../paylibs/print/printx/BaseXPrint.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index 05eaf78..203270a 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -891,15 +891,16 @@ public abstract class BaseXPrint { } dashBreak(); - print2ColumnsString("Refund Total:MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(refundTotal)); +// print2ColumnsString("Refund Total:MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(refundTotal)); + printer.appendPrnStr("Refund Total:MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(refundTotal) + " ", fontNormal, false); dashBreak(); - print2ColumnsString("Sale Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount)); +// print2ColumnsString("Sale Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount)); + printer.appendPrnStr("Sale Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount) + " ", fontNormal, false); dashBreak(); - print2ColumnsString("Grand Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount - refundTotal)); +// print2ColumnsString("Grand Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount - refundTotal)); + printer.appendPrnStr("Grand Total :MMK", PrintUtils.getInstance().getSeparatorOnlyNumberFormat(totalAmount - refundTotal) + " ", fontNormal, false); dashBreakEnding(); // emptyLine(2); - - } private void printErrorBlock(String msg) { @@ -1113,7 +1114,8 @@ public abstract class BaseXPrint { printer.appendPrnStr("TIME :" + payDetail.getTransTime(), fontNormal, AlignEnum.LEFT, false); if (payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == 1) { // printer.appendPrnStr("TRACE NO:" + traceNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false); - printer.appendPrnStr("INV NO :" + invoiceNo , fontNormal, AlignEnum.LEFT,false); +// printer.appendPrnStr("INV NO :" + invoiceNo , fontNormal, AlignEnum.LEFT,false); + printer.appendPrnStr("TRACE NO :" + traceNum , fontNormal, AlignEnum.LEFT,false); } else if (!payDetail.getTransType().equals(SETTLEMENT) && !payDetail.getTransType().equals(SUMMARY) && payDetail.getTransactionType() != TransactionsType.MMQR_REFUND.value && payDetail.getTransactionType() != TransactionsType.MMQR.value) { printer.appendPrnStr("BTH NO :" + batchNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false); } else if (payDetail.getTransType().equals(SUMMARY)) { @@ -1199,7 +1201,8 @@ public abstract class BaseXPrint { printer.appendPrnStr("TIME :" + payDetail.getTransTime(), fontNormal, AlignEnum.LEFT, false); if (payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == 1) { // printer.appendPrnStr("TRACE NO:" + traceNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false); - printer.appendPrnStr("INV NO :" + invoiceNo , fontNormal, AlignEnum.LEFT,false); +// printer.appendPrnStr("INV NO :" + invoiceNo , fontNormal, AlignEnum.LEFT,false); + printer.appendPrnStr("TRACE NO :" + traceNum , fontNormal, AlignEnum.LEFT,false); } else if (!payDetail.getTransType().equals(SETTLEMENT) && !payDetail.getTransType().equals(SUMMARY) && payDetail.getTransactionType() != TransactionsType.MMQR_REFUND.value && payDetail.getTransactionType() != TransactionsType.MMQR.value) { // printer.appendPrnStr("BTH NO :" + batchNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false); } else if (payDetail.getTransType().equals(SUMMARY)) { From c495a29b060929e2f33b825b958a602261e97556 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Fri, 16 Jan 2026 01:28:47 +0630 Subject: [PATCH 14/16] temp card settlement fix --- .../kbz/ui/settlement/SettlementTransactionFragment.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java index c7d43c9..c15c8aa 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementTransactionFragment.java @@ -395,6 +395,10 @@ public class SettlementTransactionFragment extends DataBindingFragment implement } public void onConfirm(){ + if(saleCount == 0){ + showDeclineDialog("No Transaction Found!"); + return; + } if(sharedViewModel.getTransMenu().getValue() == TransMenu.SETTLEMENT) { /* April 10 , 2024 Smile requested not to send to host even settlement button was clicked */ settlementViewModel.startSettlementProcess(); From 3a14c574a85f49d3e9d7b2f0b0a5e2024fa9dc16 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Fri, 16 Jan 2026 01:28:59 +0630 Subject: [PATCH 15/16] Create release_key.jks --- release_key.jks | Bin 0 -> 2612 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 release_key.jks diff --git a/release_key.jks b/release_key.jks new file mode 100644 index 0000000000000000000000000000000000000000..bafec2b544812b766428f048bcac42bbef8afcf0 GIT binary patch literal 2612 zcma);c{tPy7st(*8Ef{Ki!70~+#ec4AsK6yDErc&?A)=h3DY&U+=eMBgE85{i0s+- z^~y4q7~ztAjT({M-sgRv?(_cjzJHwOJm>p8-}C3^IRKUw0D~9-EXy>EMGj|xqn`mW zfk;@E0SK0*=ZD+@V4=nTWkE9`Sm?7KGT}!(hOzx8#m))>ldw>&AEG+o_A>!J1K0wp z|BUQ_JcLhcLu2W)r(Lkq%SIo;Co6vidKP7a!O~n{kQl%YWB&I=Fbk9cI0s{K!Wn>E z86hA!2v^T|?!2tyA>Rw48vW7ZoN@>jGW91W}0zxP2Q{G?Xq6mT4V zdx}E+o>|8OR9avixwB)+SVYB5Az3o;5*!7$=ycdn)oQtP6sbZB+a1U|;9M#3Vk-JJ z#7F{Ppq2PhL1@^olM{(f%2<@gSP^dK*(bI)1hR?OJr2_j*~2_ z7BdRUs7Ss2iMU_^&$nZcZ`|~`tdkHXhq(cX*lR_9kRV>Pch|>^kSAgu3c3qZAppi=tuZkbL9leYA}1BD9r>bfvG@#M*UX%;M9g znfWCjn)Z5WTE#LddZq?1c8IDC8-J~lSJgsoDnTut40;YQteZG|6Y}(K8J9Ai8VY9GaL3 zl>R)@8KkW685{{lP`@Tr)Ht|sG_HyIbdR25O!hM*);AA}cp4Lk+fmof(mZH0!fLlx zGe`Ij{CiS@OeDr`dlNTZ!%{3JQgPS&l59y#$f_hyDc;V88ikDn_TERz?ez8b<;T2+ zZM+Xv!cMO>8l6zHc^^T&yYiP{s!r)cR@_zUv zw>w1iNYZe}d|zncE1nf&*R8d6$ipr|02&5u_g>e5| zVuF#d5HNsc{0;^&{Al!l9MJzl^ac3Bq5gXq|Ds{$?UjY5D;1Y(aQ_dY<7oP;^K=f* z4(h1t^qT5)43;q_Bs@qQpJLy6lmKTj+5R%(=s~G zeYUyn5XvJceAZN@o?ldQs{$t)K<{hrS%3cY4;CBKw?^+7ZV=q9Shp`nyl)rNemY7> zR>n>>KI&fGRk;%DEBfk7Y>mUOLw5u9nCCTDMS`Kzm<9BPX}q`S{Q)mbVW&>HlQ#eG z1JmPRbD_hr3mH`@Z4EuGcp=U z&y9S{_}aHPKio}NaO_dqgmYi*aXY&M;cE$ZqF*xC7v5E>ByZ~3g5#AJ#R3G z&J8EJ?d}ySRIqvtnUnK9(uSsxhR!9#oq{bh>B2WV*aV4*Y%3h*`q+m{6{H8Zz5x@d zWPg^{i)DBAYG;$$?OLM3K4K0uia+p|mWDj{0-Y!v->Le=!#W%`^-4k}A*S41Gq>&oXLQase z6#X=&aH4oaw{%^2Bygqs?1AN6+@ur&hi8!G%`jp;tS8rx@`z1YRqyOVBRL1_f>8Yo zw#{*i$KZ+cywi`9cEsXqRB5yuM~l!3VoF2ip=aI#Mt!62OsMjk!t=WWqm3bajc?_O zsquR+ms$lW?xtP=mhvs7ofwx+DG?>HD98@v~QQUkx74-5O_FgP@wcfKjjyTE78hivu^(Jzdsn!K*~S2*tt zaV5O5p4&9%T!iFtO-^1AlQZ(Ho*p@>Qw@nTnj$me(L$7EZ6!C_*RARL9lD~> zpoShsY-CLG4rZjnBx!Xx8|cLkr*U(5AHQ?w%f>$8lx*q0X1XS)_}zcMACaTFM9ASz{Att%q$tb*F2_cEc*MY zAIJ1aq78oDCHuu!d`@y9&310^FWd3XQ@{jJ1kU{Yq`)9314K+dK}%R?TUHZ6GKtHr w`{E;)mw%7K9KABwP4S5xXPkoYNu?xj*kvDmis@97FWjFHAn5z`{tE$r1988~w*UYD literal 0 HcmV?d00001 From 36f5d521cd19a741af8a3f56802f9dfb4a1cc825 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Fri, 16 Jan 2026 01:48:54 +0630 Subject: [PATCH 16/16] Update ReprintAnyTransactionFragment.java --- .../kbz/ui/management/ReprintAnyTransactionFragment.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/management/ReprintAnyTransactionFragment.java b/app/src/main/java/com/utsmm/kbz/ui/management/ReprintAnyTransactionFragment.java index bb15a74..874bd4f 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/management/ReprintAnyTransactionFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/management/ReprintAnyTransactionFragment.java @@ -362,7 +362,11 @@ public class ReprintAnyTransactionFragment extends DataBindingFragment { * */ // sharedViewModel.transMenu.postValue(TransMenu.REPRINT); sharedViewModel.setTransMenu(TransMenu.REPRINT); - payDetail.setTransType(payDetail.getTransType()+"(REPRINT)"); +// payDetail.setTransType(payDetail.getTransType()+"(REPRINT)"); + //tempo guarding the Reprint duplicate by kmk + if (!payDetail.getTransType().contains("REPRINT")) { + payDetail.setTransType(payDetail.getTransType() + "(REPRINT)"); + } sharedViewModel.payDetail.postValue(payDetail); routeId = R.id.action_reprintAnyTransactionFragment_to_confirmTransactionFragment;