Merge branch 'production_1.0' into merge_latest_SIT

This commit is contained in:
MooN 2026-01-18 11:14:06 +06:30
commit 22ddf9284c
30 changed files with 503 additions and 123 deletions

9
.gitignore vendored
View File

@ -14,6 +14,9 @@
.cxx
local.properties
/.idea
/app/release
/app/sit/release
/app/uat/release
/app/release/*
/app/sit/release/*
/app/uat/release/*
/app/uat
/.idea
/app/prod/release

View File

@ -13,12 +13,6 @@
</DropdownSelection>
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="testSalePacket()">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
<SelectionState runConfigName="testResponseSalePacket()">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

View File

@ -14,8 +14,8 @@ android {
applicationId "com.utsmm.kbz"
minSdk 24
targetSdk 33
versionCode 15
versionName "1.14"
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@ -43,44 +43,18 @@ android {
dimension "env"
applicationId "com.utsmm.kbz"
versionNameSuffix ""
resValue "string", "app_name", "KBZ-POS"
}
}
// 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 false
minifyEnabled true
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
debuggable false
}
}
compileOptions {

244
app/proguard-rules.pro vendored
View File

@ -20,7 +20,249 @@
# 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
# Hilt ProGuard Rules - CRITICAL FOR DEPENDENCY INJECTION
-dontwarn dagger.hilt.**
-keep class dagger.hilt.** { *; }
-keep class * extends dagger.hilt.** { *; }
# 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 { *; }
# Keep Hilt entry points and components
-keep @dagger.hilt.InstallIn class * { *; }
-keep @dagger.hilt.android.AndroidEntryPoint class * { *; }
-keep @dagger.hilt.android.HiltAndroidApp class * { *; }
# 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 * { *; }
# Keep all classes that have @Inject constructors, fields, or methods
-keepclasseswithmembers class * {
@javax.inject.Inject <init>(...);
}
-keepclasseswithmembers class * {
@javax.inject.Inject <fields>;
}
-keepclasseswithmembers class * {
@javax.inject.Inject <methods>;
}
# 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.* { <fields>; }
-keep class com.utsmyanmar.baselib.network.model.sirius.* { <fields>; }
-keep class com.utsmyanmar.baselib.db.model.* { <fields>; }
-keep class com.utsmyanmar.ecr.data.* { <fields>; }
-keep class com.utsmyanmar.ecr.data.model.* { <fields>; }
-keep class com.utsmyanmar.mpulib.data.model.* { <fields>; }
-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 <fields>;
}
-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 {
# <init>(...);
#}
#-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.* <methods>;
}
# 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.checkxread.** { *; }
-keep class com.utsmyanmar.ecr.** { *; }
-keep class com.utsmyanmar.mpulib.** { *; }
-keep class com.utsmyanmar.baselib.** { *; }
# Enum preservation for critical enums
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# Keep model classes from obfuscation completely
-keep class com.utsmyanmar.paylibs.model.** { *; }
-keep class com.utsmyanmar.baselib.db.model.** { *; }
# Critical: Keep all native methods and JNI classes
-keepclasseswithmembernames class * {
native <methods>;
}
# Keep critical system params and utils
-keep class com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation { *; }
-keep class com.utsmyanmar.paylibs.utils.** { *; }
# 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 * { *; }
# 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

View File

@ -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);
@ -426,15 +428,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 +504,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 +523,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();

View File

@ -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();
});
}

View File

@ -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());
}

View File

@ -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)) {

View File

@ -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());
}
}
@ -367,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;

View File

@ -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();
}

View File

@ -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<PayDetail> 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);
}

View File

@ -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);

View File

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

View File

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

View File

@ -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();
}
}
}

View File

@ -223,6 +223,35 @@
</LinearLayout>
<!-- MMQR Ref Row -->
<!-- <LinearLayout-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:orientation="horizontal"-->
<!-- android:gravity="center_vertical"-->
<!-- android:layout_marginTop="8dp"-->
<!-- android:visibility="@{(sharedViewModel.payDetail != null &amp;&amp; sharedViewModel.payDetail.qrReferNo != null &amp;&amp; !sharedViewModel.payDetail.qrReferNo.empty) ? android.view.View.VISIBLE : android.view.View.GONE}">-->
<!-- <TextView-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_weight="1"-->
<!-- android:text="MMQR Ref"-->
<!-- android:textColor="@color/colorTextContent"-->
<!-- android:textSize="14sp"-->
<!-- android:fontFamily="@font/rubik_regular" />-->
<!-- <TextView-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:text="@{sharedViewModel.payDetail.qrReferNo}"-->
<!-- android:textColor="@color/colorTextTitle"-->
<!-- android:textSize="14sp"-->
<!-- android:fontFamily="@font/rubik_medium"-->
<!-- tools:text="REF123456789"-->
<!-- android:maxLines="1"-->
<!-- android:ellipsize="end"/>-->
<!-- </LinearLayout>-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -231,27 +260,37 @@
android:layout_marginTop="8dp"
android:visibility="@{(sharedViewModel.payDetail != null &amp;&amp; sharedViewModel.payDetail.qrReferNo != null &amp;&amp; !sharedViewModel.payDetail.qrReferNo.empty) ? android.view.View.VISIBLE : android.view.View.GONE}">
<!-- Label : 30% -->
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_weight="3"
android:text="MMQR Ref"
android:textColor="@color/colorTextContent"
android:textSize="14sp"
android:fontFamily="@font/rubik_regular" />
<!-- Value : 70% -->
<TextView
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="7"
android:gravity="end"
android:text="@{sharedViewModel.payDetail.qrReferNo}"
android:textColor="@color/colorTextTitle"
android:textSize="14sp"
android:fontFamily="@font/rubik_medium"
tools:text="REF123456789" />
android:maxLines="1"
android:ellipsize="end"
tools:text="REF123456789123456789123456789012345" />
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>

View File

@ -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"

View File

@ -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}"

View File

@ -615,5 +615,6 @@
<string name="txt_total_qr_transactions">Total QR Transactions</string>
<string name="txt_no_qr_transactions_to_settle">No QR transactions to settle</string>
<string name="txt_settle_qr_transactions">Confirm</string>
<string name="txt_search_by_trace">Search By Trace No</string>
</resources>

View File

@ -28,3 +28,28 @@
-dontwarn com.android.org.bouncycastle.**
-keep class org.bouncycastle.** {*;}
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
# 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 <init>(...);
}
-keepclasseswithmembers class * {
@javax.inject.Inject <fields>;
}
-keepclasseswithmembers class * {
@javax.inject.Inject <methods>;
}

View File

@ -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
@ -257,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)
@ -290,8 +287,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 and prod
final Gson gson =
new GsonBuilder().create();
@ -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 = "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/";
// }
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())

View File

@ -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;

View File

@ -24,8 +24,8 @@ public interface KPayApiService {
//this accept "url" bez this api start with https and other are http in uat
@POST
Observable<KPayQRRequest.CloseOrderResponse> closeOrder(@Url String url, @Body KPayQRRequest.CloseOrderRequest closeOrderRequest);
@POST("closeorder")
Observable<KPayQRRequest.CloseOrderResponse> closeOrder(@Body KPayQRRequest.CloseOrderRequest closeOrderRequest);
//this 2 is for production

View File

@ -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);
}

View File

@ -86,8 +86,8 @@ public class Repository {
}
public Observable<KPayQRRequest.CloseOrderResponse> 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
}
@ -120,7 +120,7 @@ public class Repository {
}
public Observable<EReceiptResponse> 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;

View File

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

View File

@ -19,3 +19,37 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-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 { *; }
# 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

View File

@ -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());
// }
@ -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("Sale 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,9 +1114,10 @@ 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);
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);
}
@ -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)) {

View File

@ -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 = "";

BIN
release_key.jks Normal file

Binary file not shown.