From 999b26de2baa9fa54810fd6bf3bb6272c050a0ed Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:21:03 +0630 Subject: [PATCH 01/14] animation in host config --- .../ui/management/ReprintReceiptFragment.java | 35 +++++++- .../kbz/ui/settings/HostConfigFragment.java | 84 ++++++++++++++++++- 2 files changed, 117 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/management/ReprintReceiptFragment.java b/app/src/main/java/com/utsmm/kbz/ui/management/ReprintReceiptFragment.java index 82ee67b..dbda7fb 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/management/ReprintReceiptFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/management/ReprintReceiptFragment.java @@ -1,5 +1,7 @@ package com.utsmm.kbz.ui.management; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.os.Bundle; import android.view.View; @@ -40,6 +42,8 @@ public class ReprintReceiptFragment extends DataBindingFragment { private static final String TAG = ReprintReceiptFragment.class.getSimpleName(); private PayDetail payDetail; + private ObjectAnimator slideUpAnimator; + private View printingCard; @Override protected void initViewModel() { @@ -76,6 +80,7 @@ public class ReprintReceiptFragment extends DataBindingFragment { @Override public void onPause() { super.onPause(); + stopPrintingAnimation(); } @@ -105,7 +110,7 @@ public class ReprintReceiptFragment extends DataBindingFragment { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - + printingCard = mBinding.getRoot().findViewById(R.id.printingCard); } private void updateUIPrintReceiptFailure(PayDetail payDetail) { @@ -140,6 +145,7 @@ public class ReprintReceiptFragment extends DataBindingFragment { } } else if (PrintHelper.getInstance().paperRollStatus() == SdkResult.Success) { + startPrintingAnimation(); printReceipt(payDetail); } } @@ -195,17 +201,44 @@ public class ReprintReceiptFragment extends DataBindingFragment { private PrintXStatus printXStatus = new PrintXStatus() { @Override public void onSuccess() { + stopPrintingAnimation(); delayFunctionCall(ReprintReceiptFragment.this::navigateMainScreen); } @Override public void onFailure() { + stopPrintingAnimation(); updateUIPrintReceiptFailure(payDetail); // checkPaperExists(payDetail); } }; + private void startPrintingAnimation() { + if (printingCard == null) { + return; + } + if (slideUpAnimator != null && slideUpAnimator.isRunning()) { + return; + } + + slideUpAnimator = ObjectAnimator.ofFloat(printingCard, View.TRANSLATION_Y, 0f, -20f); + slideUpAnimator.setDuration(420); + slideUpAnimator.setRepeatMode(ValueAnimator.REVERSE); + slideUpAnimator.setRepeatCount(ValueAnimator.INFINITE); + slideUpAnimator.start(); + } + + private void stopPrintingAnimation() { + if (slideUpAnimator != null) { + slideUpAnimator.cancel(); + slideUpAnimator = null; + } + if (printingCard != null) { + printingCard.setTranslationY(0f); + } + } + @SuppressWarnings("ConstantConditions") private void navigateMainScreen() { diff --git a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigFragment.java b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigFragment.java index 0be3a35..1c7d5f8 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigFragment.java @@ -1,6 +1,10 @@ package com.utsmm.kbz.ui.settings; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.os.Bundle; +import android.util.Log; +import android.view.animation.LinearInterpolator; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -15,6 +19,8 @@ import com.utsmm.kbz.databinding.FragmentHostConfigBinding; import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel; import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.util.DataBindingConfig; +import com.utsmyanmar.paylibs.print.printx.PrintXReceipt; +import com.utsmyanmar.paylibs.print.printx.PrintXStatus; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; @@ -26,6 +32,9 @@ public class HostConfigFragment extends DataBindingFragment { protected Printer printer; int FONT_NORMAL = 20; int FONT_HEADER = 24; + private ObjectAnimator rollUpAnimator; + private View hostCardView; + private volatile boolean isPrintingHostConfig = false; @Override protected void initViewModel() { @@ -45,6 +54,7 @@ public class HostConfigFragment extends DataBindingFragment { super.onViewCreated(view, savedInstanceState); FragmentHostConfigBinding binding = (FragmentHostConfigBinding) this.binding; + hostCardView = binding.getRoot().findViewById(R.id.hostCard); viewModel.loadConfig(); } @@ -56,6 +66,13 @@ public class HostConfigFragment extends DataBindingFragment { sharedViewModel.printerDisabled.setValue(!SystemParamsOperation.getInstance().getPrinterEnabled()); } + @Override + public void onPause() { + super.onPause(); + stopRollUpAnimation(); + isPrintingHostConfig = false; + } + @Override protected int currentId() { return R.id.hostConfigFragment; @@ -81,7 +98,72 @@ public class HostConfigFragment extends DataBindingFragment { showDeclineDialog("Printer is disabled!"); return; } - sharedViewModel.printTerminalHostConfigs(); + if (isPrintingHostConfig) { + return; + } + startHostConfigPrint(); + } + } + + private void startHostConfigPrint() { + isPrintingHostConfig = true; + startRollUpAnimation(); + + PrintXReceipt.getInstance().printTerminalHostConfig(new PrintXStatus() { + @Override + public void onSuccess() { + requireActivity().runOnUiThread(() -> { + isPrintingHostConfig = false; + stopRollUpAnimation(); + Log.d("PrintConfig", "Print Terminal Config Success."); + }); + } + + @Override + public void onFailure() { + requireActivity().runOnUiThread(() -> { + isPrintingHostConfig = false; + stopRollUpAnimation(); + Log.e("PrintConfig", "Print Terminal Config Failure."); + showDeclineDialog("Failed to print host config."); + }); + } + }); + } + + private void startRollUpAnimation() { + if (hostCardView == null) { + return; + } + if (rollUpAnimator != null && rollUpAnimator.isRunning()) { + return; + } + hostCardView.post(() -> { + int cardTop = hostCardView.getTop(); + int cardHeight = hostCardView.getHeight(); + if (cardHeight <= 0) { + return; + } + + // Move past the top edge so the card fully leaves the screen. + float offScreenDistance = cardTop + cardHeight + 80f; + + rollUpAnimator = ObjectAnimator.ofFloat(hostCardView, View.TRANSLATION_Y, 0f, -offScreenDistance); + rollUpAnimator.setDuration(2500); + rollUpAnimator.setInterpolator(new LinearInterpolator()); + rollUpAnimator.setRepeatMode(ValueAnimator.RESTART); + rollUpAnimator.setRepeatCount(ValueAnimator.INFINITE); + rollUpAnimator.start(); + }); + } + + private void stopRollUpAnimation() { + if (rollUpAnimator != null) { + rollUpAnimator.cancel(); + rollUpAnimator = null; + } + if (hostCardView != null) { + hostCardView.setTranslationY(0f); } } } From e4bb3df554fce13451b0903a2f44eb8b7b4f3fd2 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:16:06 +0630 Subject: [PATCH 02/14] sec host --- .../kbz/ui/settings/HostConfigFragment.java | 2 +- .../kbz/ui/settings/HostConfigViewModel.java | 68 +++++- .../com/utsmm/kbz/util/tms/TMSSetupsImpl.java | 198 ++++++++--------- .../main/res/layout/fragment_host_config.xml | 200 ++++++++++++------ .../network/model/sirius/SiriusHost.java | 12 ++ .../paylibs/print/printx/BaseXPrint.java | 45 +++- .../core_utils/SystemParamsOperation.java | 81 ++++++- .../core_utils/SystemParamsSettings.java | 37 ++++ 8 files changed, 466 insertions(+), 177 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigFragment.java b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigFragment.java index 1c7d5f8..a09f165 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigFragment.java @@ -149,7 +149,7 @@ public class HostConfigFragment extends DataBindingFragment { float offScreenDistance = cardTop + cardHeight + 80f; rollUpAnimator = ObjectAnimator.ofFloat(hostCardView, View.TRANSLATION_Y, 0f, -offScreenDistance); - rollUpAnimator.setDuration(2500); + rollUpAnimator.setDuration(3000); rollUpAnimator.setInterpolator(new LinearInterpolator()); rollUpAnimator.setRepeatMode(ValueAnimator.RESTART); rollUpAnimator.setRepeatCount(ValueAnimator.INFINITE); diff --git a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java index 18cc318..d690c53 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java @@ -40,6 +40,16 @@ public class HostConfigViewModel extends ViewModel { public MutableLiveData secHostPrimaryPort = new MutableLiveData<>(); public MutableLiveData secHostSecondaryIp = new MutableLiveData<>(); public MutableLiveData secHostSecondaryPort = new MutableLiveData<>(); + public MutableLiveData secHostCurrency = new MutableLiveData<>(); + + // Third Host + public MutableLiveData thirdHostName = new MutableLiveData<>(); + public MutableLiveData thirdHostShortCode = new MutableLiveData<>(); + public MutableLiveData thirdHostPrimaryIp = new MutableLiveData<>(); + public MutableLiveData thirdHostPrimaryPort = new MutableLiveData<>(); + public MutableLiveData thirdHostSecondaryIp = new MutableLiveData<>(); + public MutableLiveData thirdHostSecondaryPort = new MutableLiveData<>(); + public MutableLiveData thirdHostCurrency = new MutableLiveData<>(); public MutableLiveData terminalName = new MutableLiveData<>(); @@ -49,7 +59,7 @@ public class HostConfigViewModel extends ViewModel { merchantName.setValue(sp.getMerchantName()); merchantPhone.setValue(sp.getMerchantPhoneNo()); merchantAddress1.setValue(wrapMerchantAddress(sp.getMerchantAddress())); - terminalName.setValue(sp.getTerminalName()); + terminalName.setValue(wrapTerminalName(sp.getTerminalName())); // PRIMARY HOST hostName.setValue(sp.getHostName()); @@ -64,7 +74,7 @@ public class HostConfigViewModel extends ViewModel { secondaryIp.setValue(sec[0]); secondaryPort.setValue(sec[1]); - currencyCode.setValue(sp.getCurrencyType() != null ? sp.getCurrencyType().toString() : ""); + currencyCode.setValue(normalizeCurrency(sp.getCurrencyType() != null ? sp.getCurrencyType().toString() : "")); if (sp.getSecHostName() != null && !sp.getSecHostName().isEmpty()) { @@ -81,6 +91,46 @@ public class HostConfigViewModel extends ViewModel { String[] shs = split(sp.getSecHostSecIpAddress()); secHostSecondaryIp.setValue(shs[0]); secHostSecondaryPort.setValue(shs[1]); + secHostCurrency.setValue(normalizeCurrency(sp.getSecHostCurrency())); + } + + if (sp.getThirdHostName() != null && !sp.getThirdHostName().isEmpty()) { + thirdHostName.setValue(sp.getThirdHostName()); + thirdHostShortCode.setValue(sp.getThirdHostShortCode()); + + String[] thp = split(sp.getThirdHostIpAddress()); + thirdHostPrimaryIp.setValue(thp[0]); + thirdHostPrimaryPort.setValue(thp[1]); + + String[] ths = split(sp.getThirdHostSecIpAddress()); + thirdHostSecondaryIp.setValue(ths[0]); + thirdHostSecondaryPort.setValue(ths[1]); + thirdHostCurrency.setValue(normalizeCurrency(sp.getThirdHostCurrency())); + } + } + + private String normalizeCurrency(String raw) { + if (TextUtils.isEmpty(raw)) return ""; + String value = raw.trim().toUpperCase(); + switch (value) { + case "104": + case "MMK": + return "MMK"; + case "840": + case "USD": + return "USD"; + case "156": + case "CNY": + case "RMB": + return "CNY"; + case "764": + case "THB": + return "THB"; + case "643": + case "RUB": + return "RUB"; + default: + return value; } } @@ -100,6 +150,20 @@ public class HostConfigViewModel extends ViewModel { return TextUtils.join("\n", lines); } + private String wrapTerminalName(String name) { + if (TextUtils.isEmpty(name)) return ""; + + String formattedName = name + .replace("\\r\\n", "\n") + .replace("\\n", "\n") + .replace("\r\n", "\n") + .trim(); + + List lines = wrapAddressText(formattedName, 29); + + return TextUtils.join("\n", lines); + } + private String[] split(String raw) { if (raw == null || raw.trim().isEmpty()) { return new String[]{"", ""}; diff --git a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java index e3d9e11..d2a8606 100644 --- a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java +++ b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java @@ -103,6 +103,14 @@ public class TMSSetupsImpl implements TMSSetups{ SystemParamsOperation.getInstance().setIpAddress(""); SystemParamsOperation.getInstance().setSecIpAddress(""); + SystemParamsOperation.getInstance().setThirdHostName(""); + SystemParamsOperation.getInstance().setThirdHostTerminalId(""); + SystemParamsOperation.getInstance().setThirdHostMerchantId(""); + SystemParamsOperation.getInstance().setThirdHostIpAddress(""); + SystemParamsOperation.getInstance().setThirdHostSecIpAddress(""); + SystemParamsOperation.getInstance().setThirdHostShortCode(""); + SystemParamsOperation.getInstance().setThirdHostCurrency(""); + SystemParamsOperation.getInstance().setSecHostName(""); SystemParamsOperation.getInstance().setSecHostTerminalId(""); SystemParamsOperation.getInstance().setSecHostMerchantId(""); @@ -187,120 +195,96 @@ public class TMSSetupsImpl implements TMSSetups{ } if(!siriusHosts.isEmpty()) { + SiriusHost qrHost = null; + ArrayList cardHosts = new ArrayList<>(); for (SiriusHost siriusHost: siriusHosts) { - - if( siriusHost.getTyp().equals("QR")) { - - SystemParamsOperation.getInstance().setSecHostId(siriusHost.getId()); - SystemParamsOperation.getInstance().setSecHostName(siriusHost.getName()); - SystemParamsOperation.getInstance().setSecHostTerminalId(siriusHost.getTid()); - SystemParamsOperation.getInstance().setSecHostMerchantId(extractDigits(siriusHost.getMid())); - SystemParamsOperation.getInstance().setShortCode(siriusHost.getShortCode()); - - - if (siriusHost.getPrimaryIP().contains(":")) { - - SystemParamsOperation.getInstance().setSecHostIpAddress(siriusHost.getPrimaryIP().trim()+"/"); - - } else if(siriusHost.getPrimaryIP().trim().isEmpty()) { - SystemParamsOperation.getInstance().setSecHostIpAddress(""); - } - - if (siriusHost.getSecondaryIP().contains(":")) { - - SystemParamsOperation.getInstance().setSecHostSecIpAddress(siriusHost.getSecondaryIP().trim()+"/"); - - } else if(siriusHost.getSecondaryIP().trim().isEmpty()) { - SystemParamsOperation.getInstance().setSecHostSecIpAddress(""); - } - - - - if (!siriusHost.getCurrency().isEmpty()) { - SystemParamsOperation.getInstance().setSecHostCurrency(currencyTextToCode(siriusHost.getCurrency())); -// if(tmsUpdate == TMSUpdate.CHECK){ -// if(SystemParamsOperation.getInstance().getSecHostCurrency() != null) { -// if(!currencyCodeToText(SystemParamsOperation.getInstance().getSecHostCurrency()).equals(siriusHost.getCurrency())) { -// SystemParamsOperation.getInstance().setNeedSettlement(true); -// } else { -//// SystemParamsOperation.getInstance().setCurrencyType(currencyTextToCurrencyType(siriusHost.getCurrency())); -// SystemParamsOperation.getInstance().setSecHostCurrency(currencyTextToCode(siriusHost.getCurrency())); -// } -// } -// -// } else if(tmsUpdate == TMSUpdate.UPDATE){ -// -// SystemParamsOperation.getInstance().setSecHostCurrency(currencyTextToCode(siriusHost.getCurrency())); -// } - } - if (siriusHost.getShortCode() == null || siriusHost.getShortCode().isEmpty()) { - SystemParamsOperation.getInstance().setShortCode(""); - } - + if ("QR".equalsIgnoreCase(siriusHost.getTyp())) { + if (qrHost == null) qrHost = siriusHost; } else { - - SystemParamsOperation.getInstance().setHostName(siriusHost.getName()); - SystemParamsOperation.getInstance().setTerminalId(siriusHost.getTid()); - SystemParamsOperation.getInstance().setMerchantId(siriusHost.getMid()); - - if (siriusHost.getPrimaryIP().contains(":")) { - - SystemParamsOperation.getInstance().setIpAddress(siriusHost.getPrimaryIP().trim()); - - } else if(siriusHost.getPrimaryIP().trim().isEmpty()) { - SystemParamsOperation.getInstance().setIpAddress(""); - } - String secondaryIp = siriusHost.getSecondaryIP(); - if(secondaryIp == null || secondaryIp.trim().isEmpty()){ - SystemParamsOperation.getInstance().setSecIpAddress(""); - }else if(secondaryIp.contains(":")){ - SystemParamsOperation.getInstance().setSecIpAddress(secondaryIp.trim()); - } - -// if (siriusHost.getSecondaryIP().contains(":")) { -// -// SystemParamsOperation.getInstance().setSecIpAddress(siriusHost.getSecondaryIP().trim()); -// -// } else if(siriusHost.getSecondaryIP().trim().isEmpty()){ -// SystemParamsOperation.getInstance().setSecIpAddress(""); -// } - - - if (!siriusHost.getCurrency().isEmpty()) { - SystemParamsOperation.getInstance().setCurrencyType(currencyTextToCurrencyType(siriusHost.getCurrency())); -// if(tmsUpdate == TMSUpdate.CHECK){ -// if(SystemParamsOperation.getInstance().getCurrencyCode() != null) { -// if(!currencyCodeToText(SystemParamsOperation.getInstance().getCurrencyCode()).equals(siriusHost.getCurrency())) { -// SystemParamsOperation.getInstance().setNeedSettlement(true); -// } else { -// -// SystemParamsOperation.getInstance().setCurrencyType(currencyTextToCurrencyType(siriusHost.getCurrency())); -//// SystemParamsOperation.getInstance().setCurrencyCode(currencyTextToCode(siriusHost.getCurrency())); -// } -// } -// -// } else if(tmsUpdate == TMSUpdate.UPDATE){ -// SystemParamsOperation.getInstance().setCurrencyType(currencyTextToCurrencyType(siriusHost.getCurrency())); -//// SystemParamsOperation.getInstance().setCurrencyCode(currencyTextToCode(siriusHost.getCurrency())); -// } - } - - if (siriusHost.getTid().isEmpty() || siriusHost.getMid().isEmpty() ) { - if(siriusHost.getTid().isEmpty()) { - SystemParamsOperation.getInstance().setTerminalId(""); - } - if(siriusHost.getMid().isEmpty()) { - SystemParamsOperation.getInstance().setMerchantId(""); - } - - } - + cardHosts.add(siriusHost); } - } + // For dual-currency card flow, prefer MMK as PRIMARY HOST. + if (cardHosts.size() >= 2) { + SiriusHost first = cardHosts.get(0); + SiriusHost second = cardHosts.get(1); + boolean firstIsMMK = "MMK".equalsIgnoreCase(first.getCurrency()); + boolean secondIsMMK = "MMK".equalsIgnoreCase(second.getCurrency()); + if (!firstIsMMK && secondIsMMK) { + cardHosts.set(0, second); + cardHosts.set(1, first); + } + } + // PRIMARY HOST (Card #1) + if (!cardHosts.isEmpty()) { + SiriusHost primaryCard = cardHosts.get(0); + SystemParamsOperation.getInstance().setHostName(primaryCard.getName() == null ? "" : primaryCard.getName()); + SystemParamsOperation.getInstance().setTerminalId(primaryCard.getTid() == null ? "" : primaryCard.getTid()); + SystemParamsOperation.getInstance().setMerchantId(primaryCard.getMid() == null ? "" : primaryCard.getMid()); + + String primaryIp = primaryCard.getPrimaryIP(); + SystemParamsOperation.getInstance().setIpAddress(primaryIp != null && primaryIp.contains(":") ? primaryIp.trim() : ""); + + String secondaryIp = primaryCard.getSecondaryIP(); + SystemParamsOperation.getInstance().setSecIpAddress(secondaryIp != null && secondaryIp.contains(":") ? secondaryIp.trim() : ""); + + if (!TextUtils.isEmpty(primaryCard.getCurrency())) { + SystemParamsOperation.getInstance().setCurrencyType(currencyTextToCurrencyType(primaryCard.getCurrency())); + } + } + + // SECONDARY HOST (Card #2) + if (cardHosts.size() > 1) { + SiriusHost secondaryCard = cardHosts.get(1); + SystemParamsOperation.getInstance().setThirdHostName(secondaryCard.getName() == null ? "" : secondaryCard.getName()); + SystemParamsOperation.getInstance().setThirdHostTerminalId(secondaryCard.getTid() == null ? "" : secondaryCard.getTid()); + SystemParamsOperation.getInstance().setThirdHostMerchantId(secondaryCard.getMid() == null ? "" : secondaryCard.getMid()); + SystemParamsOperation.getInstance().setThirdHostShortCode(secondaryCard.getShortCode() == null ? "" : secondaryCard.getShortCode()); + + String thirdPrimaryIp = secondaryCard.getPrimaryIP(); + SystemParamsOperation.getInstance().setThirdHostIpAddress(thirdPrimaryIp != null && thirdPrimaryIp.contains(":") ? thirdPrimaryIp.trim() : ""); + + String thirdSecondaryIp = secondaryCard.getSecondaryIP(); + SystemParamsOperation.getInstance().setThirdHostSecIpAddress(thirdSecondaryIp != null && thirdSecondaryIp.contains(":") ? thirdSecondaryIp.trim() : ""); + + if (!TextUtils.isEmpty(secondaryCard.getCurrency())) { + SystemParamsOperation.getInstance().setThirdHostCurrency(currencyTextToCode(secondaryCard.getCurrency())); + } + } + + // QR HOST + if (qrHost != null) { + SystemParamsOperation.getInstance().setSecHostId(qrHost.getId()); + SystemParamsOperation.getInstance().setSecHostName(qrHost.getName()); + SystemParamsOperation.getInstance().setSecHostTerminalId(qrHost.getTid() == null ? "" : qrHost.getTid()); + SystemParamsOperation.getInstance().setSecHostMerchantId(qrHost.getMid() == null ? "" : extractDigits(qrHost.getMid())); + SystemParamsOperation.getInstance().setShortCode(qrHost.getShortCode()); + + String qrPrimaryIp = qrHost.getPrimaryIP(); + if (qrPrimaryIp != null && qrPrimaryIp.contains(":")) { + SystemParamsOperation.getInstance().setSecHostIpAddress(qrPrimaryIp.trim()+"/"); + } else { + SystemParamsOperation.getInstance().setSecHostIpAddress(""); + } + + String qrSecondaryIp = qrHost.getSecondaryIP(); + if (qrSecondaryIp != null && qrSecondaryIp.contains(":")) { + SystemParamsOperation.getInstance().setSecHostSecIpAddress(qrSecondaryIp.trim()+"/"); + } else { + SystemParamsOperation.getInstance().setSecHostSecIpAddress(""); + } + + if (!TextUtils.isEmpty(qrHost.getCurrency())) { + SystemParamsOperation.getInstance().setSecHostCurrency(currencyTextToCode(qrHost.getCurrency())); + } + + if (qrHost.getShortCode() == null || qrHost.getShortCode().isEmpty()) { + SystemParamsOperation.getInstance().setShortCode(""); + } + } } diff --git a/app/src/main/res/layout/fragment_host_config.xml b/app/src/main/res/layout/fragment_host_config.xml index d9c26d1..6f5a56c 100644 --- a/app/src/main/res/layout/fragment_host_config.xml +++ b/app/src/main/res/layout/fragment_host_config.xml @@ -96,65 +96,73 @@ android:layout_width="match_parent"/> - - - + android:orientation="vertical" + android:visibility='@{!TextUtils.isEmpty(viewModel.hostName) ? View.VISIBLE : View.GONE}' + tools:visibility="visible"> - - - - + - - - - + - - - - + + + + - - - - - - - - + + + + - - - - + + + + - - - - + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + android:visibility='@{!TextUtils.isEmpty(viewModel.thirdHostName) ? View.VISIBLE : View.GONE}' + tools:visibility="gone"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + + android:text='@{": " + viewModel.secHostCurrency}'/> diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/network/model/sirius/SiriusHost.java b/baselib/src/main/java/com/utsmyanmar/baselib/network/model/sirius/SiriusHost.java index cca6cb1..89d1a7e 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/network/model/sirius/SiriusHost.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/network/model/sirius/SiriusHost.java @@ -1,5 +1,7 @@ package com.utsmyanmar.baselib.network.model.sirius; +import com.google.gson.annotations.SerializedName; + public class SiriusHost { private String id; @@ -9,6 +11,8 @@ public class SiriusHost { private String primaryIP; private String secondaryIP; + @SerializedName(value = "thirdIP", alternate = {"thirdIp", "tertiaryIP", "tertiaryIp"}) + private String thirdIP; private String currency; @@ -53,6 +57,10 @@ public class SiriusHost { this.secondaryIP = secondaryIP; } + public void setThirdIP(String thirdIP) { + this.thirdIP = thirdIP; + } + public void setCurrency(String currency) { this.currency = currency; } @@ -89,6 +97,10 @@ public class SiriusHost { return secondaryIP; } + public String getThirdIP() { + return thirdIP; + } + public String getCurrency() { return currency; } 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 40f49b0..8d66a7e 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 @@ -1069,15 +1069,28 @@ public abstract class BaseXPrint { receiptHeader = SystemParamsOperation.getInstance().getReceiptHeader(); merchantAddress = SystemParamsOperation.getInstance().getMerchantAddress(); - if(merchantAddress != null){ - //this step is needed for manually line break with \n in the Address - merchantAddress = merchantAddress.replace("\\n", "\n"); + if (merchantAddress != null) { + // Support manual line breaks entered as escaped/newline sequences. + merchantAddress = merchantAddress + .replace("\\r\\n", "\n") + .replace("\\n", "\n") + .replace("\r\n", "\n"); } terminalName = SystemParamsOperation.getInstance().getTerminalName(); + if (terminalName != null) { + // Keep behavior aligned with address wrapping for printed slips. + terminalName = terminalName + .replace("\\r\\n", "\n") + .replace("\\n", "\n") + .replace("\r\n", "\n"); + } assert merchantAddress != null; List result = wrapAddressText(merchantAddress, 29); + List terminalLines = TextUtils.isEmpty(terminalName) + ? new ArrayList<>() + : wrapAddressText(terminalName.trim(), 29); if (receiptHeader == null || TextUtils.equals(receiptHeader, "") || receiptHeader.trim().isEmpty()) { receiptHeader = merchantName; @@ -1085,11 +1098,13 @@ public abstract class BaseXPrint { if (TextUtils.equals(merchantAddress, "")) { merchantAddress = ""; } - if(TextUtils.equals(terminalName, "") || terminalName == null){ + if (TextUtils.equals(terminalName, "") || terminalName == null) { terminalName = ""; } - printer.appendPrnStr(terminalName, fontNormal, AlignEnum.CENTER, true); + for (String line : terminalLines) { + printer.appendPrnStr(line, fontNormal, AlignEnum.CENTER, true); + } for (String line : result) { //result get the List of text from auto/manually break the address @@ -1316,7 +1331,7 @@ public abstract class BaseXPrint { dotBreak(); // ---------- SECONDARY HOST (optional) ---------- if (!TextUtils.isEmpty(sp.getSecHostName())) { - printer.appendPrnStr("SECONDARY HOST", fontNormal, AlignEnum.LEFT, true); + printer.appendPrnStr("QR HOST", fontNormal, AlignEnum.LEFT, true); printer.appendPrnStr("Name : " + sp.getSecHostName(), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("SHORT CODE : " + sp.getShortCode(), fontNormal, AlignEnum.LEFT, false); String[] secHostIp = splitIpAndPort(sp.getSecHostIpAddress()); @@ -1325,10 +1340,26 @@ public abstract class BaseXPrint { String[] secHostSecIp = splitIpAndPort(sp.getSecHostSecIpAddress()); printer.appendPrnStr("Secondary Ip : " + secHostSecIp[0], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Secondary Port: " + secHostSecIp[1], fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("Currency Code : " + sp.getCurrencyType(), fontNormal, AlignEnum.LEFT, false); + String qrHostCurrency = TextUtils.isEmpty(sp.getSecHostCurrency()) ? String.valueOf(sp.getCurrencyType()) : sp.getSecHostCurrency(); + printer.appendPrnStr("Currency Code : " + qrHostCurrency, fontNormal, AlignEnum.LEFT, false); dotBreak(); printer.appendPrnStr("App Version : " + getAppVersion(), fontNormal, AlignEnum.LEFT, false); } + + // ---------- THIRD HOST (optional) ---------- + if (!TextUtils.isEmpty(sp.getThirdHostName())) { + printer.appendPrnStr("SECONDARY HOST", fontNormal, AlignEnum.LEFT, true); + printer.appendPrnStr("Name : " + sp.getThirdHostName(), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("SHORT CODE : " + sp.getThirdHostShortCode(), fontNormal, AlignEnum.LEFT, false); + String[] thirdHostIp = splitIpAndPort(sp.getThirdHostIpAddress()); + printer.appendPrnStr("Primary Ip : " + thirdHostIp[0], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Primary Port : " + thirdHostIp[1], fontNormal, AlignEnum.LEFT, false); + String[] thirdHostSecIp = splitIpAndPort(sp.getThirdHostSecIpAddress()); + printer.appendPrnStr("Secondary Ip : " + thirdHostSecIp[0], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Secondary Port: " + thirdHostSecIp[1], fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Currency Code : " + sp.getThirdHostCurrency(), fontNormal, AlignEnum.LEFT, false); + dotBreak(); + } } private String getAppVersion() { 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 89b2073..6112ccf 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 @@ -1014,6 +1014,7 @@ public class SystemParamsOperation { saveSystemParamsSettings(params); } + public void setTmsAddress(String tmsAddress){ SystemParamsSettings params = getSystemParamsSettings(); params.setTmsAddress(tmsAddress); @@ -1036,6 +1037,7 @@ public class SystemParamsOperation { return params.getSecIpAddress(); } + public int getPortAddress(){ SystemParamsSettings params = getSystemParamsSettings(); return params.getPortAddress(); @@ -1344,22 +1346,44 @@ public class SystemParamsOperation { saveSystemParamsSettings(params); } + public void setThirdHostName(String hostName) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostName(hostName); + saveSystemParamsSettings(params); + } + public String getSecHostName() { SystemParamsSettings params = getSystemParamsSettings(); return params.getSecHostName(); } + public String getThirdHostName() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostName(); + } + public void setSecHostIpAddress(String ipAddress) { SystemParamsSettings params = getSystemParamsSettings(); params.setSecHostIpAddress(ipAddress); saveSystemParamsSettings(params); } + public void setThirdHostIpAddress(String ipAddress) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostIpAddress(ipAddress); + saveSystemParamsSettings(params); + } + public String getSecHostIpAddress() { SystemParamsSettings params = getSystemParamsSettings(); return params.getSecHostIpAddress(); } + public String getThirdHostIpAddress() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostIpAddress(); + } + public void setTokenHostAddress(String tokenHostAddress) { SystemParamsSettings params = getSystemParamsSettings(); params.setTokenHostAddress(tokenHostAddress); @@ -1387,39 +1411,78 @@ public class SystemParamsOperation { saveSystemParamsSettings(params); } + public void setThirdHostSecIpAddress(String ipAddress) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostSecIpAddress(ipAddress); + saveSystemParamsSettings(params); + } + public String getSecHostSecIpAddress() { SystemParamsSettings params = getSystemParamsSettings(); return params.getSecHostSecIpAddress(); } + public String getThirdHostSecIpAddress() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostSecIpAddress(); + } + public void setSecHostTerminalId(String terminalId) { SystemParamsSettings params = getSystemParamsSettings(); params.setSecHostTerminalId(terminalId); saveSystemParamsSettings(params); } + public void setThirdHostTerminalId(String terminalId) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostTerminalId(terminalId); + saveSystemParamsSettings(params); + } + public String getSecHostTerminalId() { SystemParamsSettings params = getSystemParamsSettings(); return params.getSecHostTerminalId(); } + public String getThirdHostTerminalId() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostTerminalId(); + } + public void setSecHostMerchantId(String merchantId) { SystemParamsSettings params = getSystemParamsSettings(); params.setSecHostMerchantId(merchantId); saveSystemParamsSettings(params); } + public void setThirdHostMerchantId(String merchantId) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostMerchantId(merchantId); + saveSystemParamsSettings(params); + } + public void setShortCode(String shortCode) { SystemParamsSettings params = getSystemParamsSettings(); params.setShortCode(shortCode); saveSystemParamsSettings(params); } + public void setThirdHostShortCode(String shortCode) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostShortCode(shortCode); + saveSystemParamsSettings(params); + } + public String getShortCode() { SystemParamsSettings params = getSystemParamsSettings(); return params.getShortCode(); } + public String getThirdHostShortCode() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostShortCode(); + } + public void setBinValue(String value) { SystemParamsSettings params = getSystemParamsSettings(); params.setBinValues(value); @@ -1437,6 +1500,11 @@ public class SystemParamsOperation { return params.getSecHostMerchantId(); } + public String getThirdHostMerchantId() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostMerchantId(); + } + public void setLastSuccessTrnx(String lastSuccessTrnx) { SystemParamsSettings params = getSystemParamsSettings(); params.setLastSuccessTranx(lastSuccessTrnx); @@ -1454,11 +1522,22 @@ public class SystemParamsOperation { saveSystemParamsSettings(params); } + public void setThirdHostCurrency(String currency) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setThirdHostCurrency(currency); + saveSystemParamsSettings(params); + } + public String getSecHostCurrency() { SystemParamsSettings params = getSystemParamsSettings(); return params.getSecHostCurrency(); } + public String getThirdHostCurrency() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getThirdHostCurrency(); + } + public String getCurrentSerialNum() { SystemParamsSettings params = getSystemParamsSettings(); return params.getCurrentSerialNum(); @@ -1761,4 +1840,4 @@ public class SystemParamsOperation { SystemParamsSettings paramsSettings = getSystemParamsSettings(); return paramsSettings.getPrinterEnabled(); } -} \ No newline at end of file +} 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 229d8de..68885f6 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 @@ -102,22 +102,29 @@ public class SystemParamsSettings implements Serializable { private String secHostId = ""; private String secHostName = ""; + private String thirdHostName = ""; private String secHostIpAddress = ""; + private String thirdHostIpAddress = ""; private String tokenHostAddress = ""; private String grantType = ""; private String secHostSecIpAddress = ""; + private String thirdHostSecIpAddress = ""; private String secHostTerminalId = ""; + private String thirdHostTerminalId = ""; private String secHostMerchantId = ""; + private String thirdHostMerchantId = ""; private String shortCode = ""; + private String thirdHostShortCode = ""; private String secHostCurrency = ""; + private String thirdHostCurrency = ""; private String disabledMessage = ""; @@ -278,26 +285,38 @@ public class SystemParamsSettings implements Serializable { return secHostName; } + protected String getThirdHostName() { return thirdHostName; } + protected String getSecHostIpAddress() { return secHostIpAddress; } + protected String getThirdHostIpAddress() { return thirdHostIpAddress; } + protected String getSecHostSecIpAddress() { return secHostSecIpAddress; } + protected String getThirdHostSecIpAddress() { return thirdHostSecIpAddress; } + protected String getSecHostTerminalId() { return secHostTerminalId; } + protected String getThirdHostTerminalId() { return thirdHostTerminalId; } + protected String getSecHostMerchantId() { return secHostMerchantId; } + protected String getThirdHostMerchantId() { return thirdHostMerchantId; } + protected String getSecHostCurrency() { return secHostCurrency; } + protected String getThirdHostCurrency() { return thirdHostCurrency; } + protected String getAuthToken() { return authToken;} protected String getEreceiptAddress() { return ereceiptAddress; } @@ -323,10 +342,14 @@ public class SystemParamsSettings implements Serializable { this.secHostName = secHostName; } + protected void setThirdHostName(String thirdHostName) { this.thirdHostName = thirdHostName; } + protected void setSecHostIpAddress(String secHostIpAddress) { this.secHostIpAddress = secHostIpAddress; } + protected void setThirdHostIpAddress(String thirdHostIpAddress) { this.thirdHostIpAddress = thirdHostIpAddress; } + protected void setBinValues(String binValues) { this.binValues = binValues; } @@ -379,10 +402,14 @@ public class SystemParamsSettings implements Serializable { this.shortCode = shortCode; } + protected void setThirdHostShortCode(String thirdHostShortCode) { this.thirdHostShortCode = thirdHostShortCode; } + protected String getShortCode() { return this.shortCode; } + protected String getThirdHostShortCode() { return this.thirdHostShortCode; } + protected long getuPiCvMLimit() { return this.uPiCvMLimit; } @@ -415,10 +442,14 @@ public class SystemParamsSettings implements Serializable { this.secHostSecIpAddress = secHostSecIpAddress; } + protected void setThirdHostSecIpAddress(String thirdHostSecIpAddress) { this.thirdHostSecIpAddress = thirdHostSecIpAddress; } + protected void setSecHostTerminalId(String secHostTerminalId) { this.secHostTerminalId = secHostTerminalId; } + protected void setThirdHostTerminalId(String thirdHostTerminalId) { this.thirdHostTerminalId = thirdHostTerminalId; } + protected void setLastSuccessTranx(String lastSuccessTranx) { this.lastSuccessTranx = lastSuccessTranx; } @@ -431,10 +462,14 @@ public class SystemParamsSettings implements Serializable { this.secHostMerchantId = secHostMerchantId; } + protected void setThirdHostMerchantId(String thirdHostMerchantId) { this.thirdHostMerchantId = thirdHostMerchantId; } + protected void setSecHostCurrency(String secHostCurrency) { this.secHostCurrency = secHostCurrency; } + protected void setThirdHostCurrency(String thirdHostCurrency) { this.thirdHostCurrency = thirdHostCurrency; } + protected void setNeedSettlement(boolean needSettlement) { this.isNeedSettlement = needSettlement; } @@ -670,6 +705,7 @@ public class SystemParamsSettings implements Serializable { protected void setSecIpAddress(String secIpAddress){ this.secIpAddress = secIpAddress;} + protected void setHostReadTimeout(String hostReadTimeout){ this.hostReadTimeout = hostReadTimeout;} protected void setReversalDelay(String reversalDelay) { this.reversalDelay = reversalDelay; } @@ -684,6 +720,7 @@ public class SystemParamsSettings implements Serializable { protected String getSecIpAddress(){ return secIpAddress;} + protected String getComp1() { return comp1; } From 34b88f81b3ef170fb851e5d19dde92b1ff343978 Mon Sep 17 00:00:00 2001 From: MooN <56061215+MgKyawLay@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:33:40 +0630 Subject: [PATCH 03/14] duel currency select in sale --- .../main/java/com/utsmm/kbz/MainFragment.java | 220 ++++++++++++++++- .../ui/dashboard/DashboardTransFragment.java | 222 +++++++++++++++++- 2 files changed, 426 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/MainFragment.java b/app/src/main/java/com/utsmm/kbz/MainFragment.java index 55bd380..9b1a4de 100644 --- a/app/src/main/java/com/utsmm/kbz/MainFragment.java +++ b/app/src/main/java/com/utsmm/kbz/MainFragment.java @@ -4,18 +4,25 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; +import androidx.appcompat.app.AlertDialog; import android.os.RemoteException; import android.text.TextUtils; import android.util.Log; +import android.util.TypedValue; import android.view.View; +import android.view.Gravity; import android.widget.Toast; +import android.widget.LinearLayout; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.Observer; +import androidx.appcompat.widget.AppCompatButton; +import androidx.core.content.ContextCompat; import com.denzcoskun.imageslider.ImageSlider; import com.denzcoskun.imageslider.constants.ScaleTypes; @@ -68,6 +75,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Date; +import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; @@ -97,6 +105,13 @@ public class MainFragment extends DataBindingFragment { private final ArrayList imgList = new ArrayList<>(); private Observer observeLastTrans; private PayDetail lastPay; + private boolean cardPrimaryHostCached = false; + private String cardPrimaryHostName = ""; + private String cardPrimaryTid = ""; + private String cardPrimaryMid = ""; + private String cardPrimaryIp = ""; + private String cardPrimarySecIp = ""; + private CurrencyType cardPrimaryCurrency = CurrencyType.MMK; @Inject EmvParamOperation emvParamOperation; @@ -420,6 +435,200 @@ public class MainFragment extends DataBindingFragment { } + private void startCardSaleFlow() { + processBatch(); + sharedViewModel.transactionsType.setValue(TransactionsType.SALE); + sharedViewModel.setTransMenu(TransMenu.SALE); + sharedViewModel.processCode.postValue(ProcessCode.SALE_PURCHASE + ProcessCode.SMART + ProcessCode.TO_ACCOUNT); + navigateToAmount(); + } + + private void showCurrencyChooserForCardSale() { + List currencies = getAvailableCardSaleCurrencies(); + if (currencies.isEmpty()) { + applyCardCurrencyAndHost("MMK"); + startCardSaleFlow(); + return; + } + + if (currencies.size() == 1) { + applyCardCurrencyAndHost(currencies.get(0)); + startCardSaleFlow(); + return; + } + + showCurrencyPickerDialog("Choose Currency", currencies, currency -> { + applyCardCurrencyAndHost(currency); + startCardSaleFlow(); + }); + } + + private List getAvailableCardSaleCurrencies() { + cachePrimaryCardHostIfNeeded(); + LinkedHashSet values = new LinkedHashSet<>(); + + if (cardPrimaryCurrency != null && !TextUtils.isEmpty(cardPrimaryCurrency.name)) { + values.add(normalizeCurrency(cardPrimaryCurrency.name)); + } + + String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency()); + if (!TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName()) && !TextUtils.isEmpty(secondaryCurrency)) { + values.add(secondaryCurrency); + } + + return new ArrayList<>(values); + } + + private void applyCardCurrencyAndHost(String selectedCurrency) { + cachePrimaryCardHostIfNeeded(); + + String selected = normalizeCurrency(selectedCurrency); + String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency()); + + boolean useSecondaryCardHost = !TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName()) + && !TextUtils.isEmpty(secondaryCurrency) + && secondaryCurrency.equals(selected); + + if (useSecondaryCardHost) { + SystemParamsOperation.getInstance().setHostName(SystemParamsOperation.getInstance().getThirdHostName()); + SystemParamsOperation.getInstance().setTerminalId(SystemParamsOperation.getInstance().getThirdHostTerminalId()); + SystemParamsOperation.getInstance().setMerchantId(SystemParamsOperation.getInstance().getThirdHostMerchantId()); + SystemParamsOperation.getInstance().setIpAddress(SystemParamsOperation.getInstance().getThirdHostIpAddress()); + SystemParamsOperation.getInstance().setSecIpAddress(SystemParamsOperation.getInstance().getThirdHostSecIpAddress()); + } else { + SystemParamsOperation.getInstance().setHostName(cardPrimaryHostName); + SystemParamsOperation.getInstance().setTerminalId(cardPrimaryTid); + SystemParamsOperation.getInstance().setMerchantId(cardPrimaryMid); + SystemParamsOperation.getInstance().setIpAddress(cardPrimaryIp); + SystemParamsOperation.getInstance().setSecIpAddress(cardPrimarySecIp); + } + + CurrencyType currencyType = useSecondaryCardHost ? toCurrencyType(selected) : cardPrimaryCurrency; + SystemParamsOperation.getInstance().setCurrencyType(currencyType); + sharedViewModel.set_currencyText(currencyType.name); + } + + private void cachePrimaryCardHostIfNeeded() { + if (cardPrimaryHostCached) { + return; + } + + cardPrimaryHostName = SystemParamsOperation.getInstance().getHostName(); + cardPrimaryTid = SystemParamsOperation.getInstance().getTerminalId(); + cardPrimaryMid = SystemParamsOperation.getInstance().getMerchantId(); + cardPrimaryIp = SystemParamsOperation.getInstance().getIpAddress(); + cardPrimarySecIp = SystemParamsOperation.getInstance().getSecIpAddress(); + CurrencyType activeCurrency = SystemParamsOperation.getInstance().getCurrencyType(); + cardPrimaryCurrency = activeCurrency == null ? CurrencyType.MMK : activeCurrency; + cardPrimaryHostCached = true; + } + + private void showCurrencyPickerDialog(String title, List currencies, CurrencySelectCallback callback) { + LinearLayout root = new LinearLayout(requireContext()); + root.setOrientation(LinearLayout.VERTICAL); + root.setPadding(dp(20), dp(20), dp(20), dp(12)); + + TextView tvTitle = new TextView(requireContext()); + tvTitle.setText(title); + tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + tvTitle.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorTextTitle)); + tvTitle.setPadding(0, 0, 0, dp(16)); + root.addView(tvTitle); + + final AlertDialog[] dialogHolder = new AlertDialog[1]; + for (String currency : currencies) { + AppCompatButton button = new AppCompatButton(requireContext()); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + dp(56) + ); + lp.bottomMargin = dp(10); + button.setLayoutParams(lp); + button.setAllCaps(false); + button.setText(currency); + button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); + button.setGravity(Gravity.CENTER); + button.setBackgroundResource(R.drawable.bg_rounded_btn_cv); + button.setTextColor(ContextCompat.getColor(requireContext(), R.color.white)); + button.setOnClickListener(v -> { + if (dialogHolder[0] != null) { + dialogHolder[0].dismiss(); + } + callback.onSelected(currency); + }); + root.addView(button); + } + + AppCompatButton cancel = new AppCompatButton(requireContext()); + LinearLayout.LayoutParams cancelLp = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + dp(52) + ); + cancel.setLayoutParams(cancelLp); + cancel.setAllCaps(false); + cancel.setText("Cancel"); + cancel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); + cancel.setBackgroundResource(R.drawable.bg_rounded_btn_cancel_cv); + cancel.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary)); + cancel.setOnClickListener(v -> { + if (dialogHolder[0] != null) { + dialogHolder[0].dismiss(); + } + }); + root.addView(cancel); + + AlertDialog dialog = new AlertDialog.Builder(requireContext()) + .setView(root) + .create(); + dialogHolder[0] = dialog; + dialog.show(); + } + + private int dp(int value) { + return Math.round(value * requireContext().getResources().getDisplayMetrics().density); + } + + private interface CurrencySelectCallback { + void onSelected(String currency); + } + + private CurrencyType toCurrencyType(String value) { + String normalized = normalizeCurrency(value); + try { + return CurrencyType.valueOf(normalized); + } catch (Exception ignored) { + return CurrencyType.MMK; + } + } + + private String normalizeCurrency(String raw) { + if (TextUtils.isEmpty(raw)) { + return ""; + } + + String value = raw.trim().toUpperCase(); + switch (value) { + case "104": + case "MMK": + return "MMK"; + case "840": + case "USD": + return "USD"; + case "156": + case "CNY": + case "RMB": + return "CNY"; + case "764": + case "THB": + return "THB"; + case "643": + case "RUB": + return "RUB"; + default: + return value; + } + } + private void processBatch() { calculateLastTransaction(); @@ -722,18 +931,11 @@ public class MainFragment extends DataBindingFragment { showSingleInfoDialog(getResourceString(R.string.txt_please_enable_internet)); } else if (SystemParamsOperation.getInstance().isNeedSettlement()) { AlertXDialog.getInstance().showDialog(requireContext(), getResourceString(R.string.title_need_settle), getResourceString(R.string.txt_do_you_want_to_continue), () -> { - processBatch(); - sharedViewModel.transactionsType.setValue(TransactionsType.SALE); - sharedViewModel.processCode.postValue(ProcessCode.SALE_PURCHASE + ProcessCode.SMART + ProcessCode.TO_ACCOUNT); - navigateToAmount(); + showCurrencyChooserForCardSale(); }); } else { - processBatch(); - sharedViewModel.transactionsType.setValue(TransactionsType.SALE); - sharedViewModel.setTransMenu(TransMenu.SALE); - sharedViewModel.processCode.postValue(ProcessCode.SALE_PURCHASE + ProcessCode.SMART + ProcessCode.TO_ACCOUNT); - navigateToAmount(); + showCurrencyChooserForCardSale(); } } diff --git a/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java b/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java index 62e3e3f..89b1983 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/dashboard/DashboardTransFragment.java @@ -2,16 +2,25 @@ package com.utsmm.kbz.ui.dashboard; import android.os.Bundle; +import android.text.TextUtils; +import android.util.TypedValue; import android.view.View; +import android.view.Gravity; +import android.widget.LinearLayout; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.AppCompatButton; +import androidx.core.content.ContextCompat; import com.utsmm.kbz.util.enums.SettlementType; import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; +import com.utsmyanmar.paylibs.utils.enums.CurrencyType; import com.utsmyanmar.paylibs.utils.enums.TransMenu; import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType; import com.utsmm.kbz.BR; @@ -24,6 +33,8 @@ import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel; import com.utsmm.kbz.util.tms.TMSUtil; import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; public class DashboardTransFragment extends DataBindingFragment { @@ -34,6 +45,13 @@ public class DashboardTransFragment extends DataBindingFragment { private ArrayList featuresList = new ArrayList<>(); MainAdapter mainAdapter; + private boolean cardPrimaryHostCached = false; + private String cardPrimaryHostName = ""; + private String cardPrimaryTid = ""; + private String cardPrimaryMid = ""; + private String cardPrimaryIp = ""; + private String cardPrimarySecIp = ""; + private CurrencyType cardPrimaryCurrency = CurrencyType.MMK; private static final int hostId = Constants.NAV_HOST_ID; private int routeId; @@ -220,9 +238,11 @@ public class DashboardTransFragment extends DataBindingFragment { } else if (checkTid()) { showDeclineDialog("Please Download Config!"); } else { - sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_SALE); - routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment; - safeRouteTo(currentId,routeId,hostId); + showCurrencyChooserForCardFlow(() -> { + sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_SALE); + routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment; + safeRouteTo(currentId, routeId, hostId); + }); } } @@ -253,10 +273,12 @@ public class DashboardTransFragment extends DataBindingFragment { public void onClickCashAdvance() { - sharedViewModel.setTransactionsType(TransactionsType.CASH_OUT); - sharedViewModel.setTransMenu(TransMenu.CASH_OUT); - routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment; - safeRouteTo(currentId,routeId,hostId); + showCurrencyChooserForCardFlow(() -> { + sharedViewModel.setTransactionsType(TransactionsType.CASH_OUT); + sharedViewModel.setTransMenu(TransMenu.CASH_OUT); + routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment; + safeRouteTo(currentId, routeId, hostId); + }); } public void onClickDeviceConfig(){ @@ -265,4 +287,190 @@ public class DashboardTransFragment extends DataBindingFragment { } } + private void showCurrencyChooserForCardFlow(Runnable onSelected) { + List currencies = getAvailableCardSaleCurrencies(); + if (currencies.isEmpty()) { + applyCardCurrencyAndHost("MMK"); + onSelected.run(); + return; + } + + if (currencies.size() == 1) { + applyCardCurrencyAndHost(currencies.get(0)); + onSelected.run(); + return; + } + + showCurrencyPickerDialog("Choose Currency", currencies, currency -> { + applyCardCurrencyAndHost(currency); + onSelected.run(); + }); + } + + private List getAvailableCardSaleCurrencies() { + cachePrimaryCardHostIfNeeded(); + LinkedHashSet values = new LinkedHashSet<>(); + + if (cardPrimaryCurrency != null && !TextUtils.isEmpty(cardPrimaryCurrency.name)) { + values.add(normalizeCurrency(cardPrimaryCurrency.name)); + } + + String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency()); + if (!TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName()) && !TextUtils.isEmpty(secondaryCurrency)) { + values.add(secondaryCurrency); + } + + return new ArrayList<>(values); + } + + private void applyCardCurrencyAndHost(String selectedCurrency) { + cachePrimaryCardHostIfNeeded(); + + String selected = normalizeCurrency(selectedCurrency); + String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency()); + + boolean useSecondaryCardHost = !TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName()) + && !TextUtils.isEmpty(secondaryCurrency) + && secondaryCurrency.equals(selected); + + if (useSecondaryCardHost) { + SystemParamsOperation.getInstance().setHostName(SystemParamsOperation.getInstance().getThirdHostName()); + SystemParamsOperation.getInstance().setTerminalId(SystemParamsOperation.getInstance().getThirdHostTerminalId()); + SystemParamsOperation.getInstance().setMerchantId(SystemParamsOperation.getInstance().getThirdHostMerchantId()); + SystemParamsOperation.getInstance().setIpAddress(SystemParamsOperation.getInstance().getThirdHostIpAddress()); + SystemParamsOperation.getInstance().setSecIpAddress(SystemParamsOperation.getInstance().getThirdHostSecIpAddress()); + } else { + SystemParamsOperation.getInstance().setHostName(cardPrimaryHostName); + SystemParamsOperation.getInstance().setTerminalId(cardPrimaryTid); + SystemParamsOperation.getInstance().setMerchantId(cardPrimaryMid); + SystemParamsOperation.getInstance().setIpAddress(cardPrimaryIp); + SystemParamsOperation.getInstance().setSecIpAddress(cardPrimarySecIp); + } + + CurrencyType currencyType = useSecondaryCardHost ? toCurrencyType(selected) : cardPrimaryCurrency; + SystemParamsOperation.getInstance().setCurrencyType(currencyType); + sharedViewModel.set_currencyText(currencyType.name); + } + + private void cachePrimaryCardHostIfNeeded() { + if (cardPrimaryHostCached) { + return; + } + + cardPrimaryHostName = SystemParamsOperation.getInstance().getHostName(); + cardPrimaryTid = SystemParamsOperation.getInstance().getTerminalId(); + cardPrimaryMid = SystemParamsOperation.getInstance().getMerchantId(); + cardPrimaryIp = SystemParamsOperation.getInstance().getIpAddress(); + cardPrimarySecIp = SystemParamsOperation.getInstance().getSecIpAddress(); + CurrencyType activeCurrency = SystemParamsOperation.getInstance().getCurrencyType(); + cardPrimaryCurrency = activeCurrency == null ? CurrencyType.MMK : activeCurrency; + cardPrimaryHostCached = true; + } + + private CurrencyType toCurrencyType(String value) { + String normalized = normalizeCurrency(value); + try { + return CurrencyType.valueOf(normalized); + } catch (Exception ignored) { + return CurrencyType.MMK; + } + } + + private String normalizeCurrency(String raw) { + if (TextUtils.isEmpty(raw)) { + return ""; + } + + String value = raw.trim().toUpperCase(); + switch (value) { + case "104": + case "MMK": + return "MMK"; + case "840": + case "USD": + return "USD"; + case "156": + case "CNY": + case "RMB": + return "CNY"; + case "764": + case "THB": + return "THB"; + case "643": + case "RUB": + return "RUB"; + default: + return value; + } + } + + private void showCurrencyPickerDialog(String title, List currencies, CurrencySelectCallback callback) { + LinearLayout root = new LinearLayout(requireContext()); + root.setOrientation(LinearLayout.VERTICAL); + root.setPadding(dp(20), dp(20), dp(20), dp(12)); + + TextView tvTitle = new TextView(requireContext()); + tvTitle.setText(title); + tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + tvTitle.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorTextTitle)); + tvTitle.setPadding(0, 0, 0, dp(16)); + root.addView(tvTitle); + + final AlertDialog[] dialogHolder = new AlertDialog[1]; + for (String currency : currencies) { + AppCompatButton button = new AppCompatButton(requireContext()); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + dp(56) + ); + lp.bottomMargin = dp(10); + button.setLayoutParams(lp); + button.setAllCaps(false); + button.setText(currency); + button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); + button.setGravity(Gravity.CENTER); + button.setBackgroundResource(R.drawable.bg_rounded_btn_cv); + button.setTextColor(ContextCompat.getColor(requireContext(), R.color.white)); + button.setOnClickListener(v -> { + if (dialogHolder[0] != null) { + dialogHolder[0].dismiss(); + } + callback.onSelected(currency); + }); + root.addView(button); + } + + AppCompatButton cancel = new AppCompatButton(requireContext()); + LinearLayout.LayoutParams cancelLp = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + dp(52) + ); + cancel.setLayoutParams(cancelLp); + cancel.setAllCaps(false); + cancel.setText("Cancel"); + cancel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); + cancel.setBackgroundResource(R.drawable.bg_rounded_btn_cancel_cv); + cancel.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary)); + cancel.setOnClickListener(v -> { + if (dialogHolder[0] != null) { + dialogHolder[0].dismiss(); + } + }); + root.addView(cancel); + + AlertDialog dialog = new AlertDialog.Builder(requireContext()) + .setView(root) + .create(); + dialogHolder[0] = dialog; + dialog.show(); + } + + private int dp(int value) { + return Math.round(value * requireContext().getResources().getDisplayMetrics().density); + } + + private interface CurrencySelectCallback { + void onSelected(String currency); + } + } From 528bcbb004dd7dc28fbcfdab9d6df0e8d48658a6 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Fri, 8 May 2026 14:10:14 +0630 Subject: [PATCH 04/14] prod ready --- app/build.gradle | 4 ++-- .../main/java/com/utsmm/kbz/MainActivity.java | 19 ++++++------------ .../main/java/com/utsmm/kbz/MainFragment.java | 12 ++--------- .../ui/qr_pay/RefundCertificateManager.java | 3 +-- .../layout/fragment_capture_card_screen.xml | 2 +- .../baselineProfiles/0/app-uat-release.dm | Bin 1923 -> 3262 bytes .../baselineProfiles/1/app-uat-release.dm | Bin 1849 -> 3182 bytes app/uat/release/output-metadata.json | 4 ++-- .../utsmyanmar/baselib/TerminalKeyUtil.java | 14 +++---------- .../utsmyanmar/baselib/di/NetworkModule.java | 9 +++++---- .../baselib/network/KPayApiService.java | 15 +++++--------- .../utsmyanmar/baselib/repo/Repository.java | 6 +++--- .../core_utils/SystemParamsSettings.java | 10 +++------ 13 files changed, 33 insertions(+), 65 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3efa929..f57d89d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId "com.utsmm.kbz" minSdk 24 targetSdk 33 - versionCode 32 - versionName "2.12" + versionCode 2 + versionName "2.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/utsmm/kbz/MainActivity.java b/app/src/main/java/com/utsmm/kbz/MainActivity.java index 7776103..ea2f59d 100644 --- a/app/src/main/java/com/utsmm/kbz/MainActivity.java +++ b/app/src/main/java/com/utsmm/kbz/MainActivity.java @@ -116,8 +116,8 @@ public class MainActivity extends AppCompatActivity implements public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); -// BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar(); - BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); + BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar(); +// BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); // Keep screen on getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); @@ -160,10 +160,8 @@ public class MainActivity extends AppCompatActivity implements } private void initKey(){ -// SystemParamsOperation.getInstance().setTmsAddress("https://api-tms-uat.kbzbank.com:8443/sirius"); - SystemParamsOperation.getInstance().setTmsAddress("https://sirius-nest.utsmyanmar.com/api/v1"); -// SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms-uat.kbzbank.com:8443/receipt"); - SystemParamsOperation.getInstance().setEReceiptAddress("https://receipt-nest.utsmyanmar.com/api/v1"); + SystemParamsOperation.getInstance().setTmsAddress("https://api-tms.kbzbank.com/sirius"); + SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms.kbzbank.com/receipt"); PinPad pinPad = MyApplication.getInstance().deviceEngine.getPinPad(); byte[] encryptedPIK = SystemParamsOperation.getInstance().getPIK(); @@ -436,16 +434,14 @@ public class MainActivity extends AppCompatActivity implements SystemParamsOperation.getInstance().setDownloadedParams(false); handleAutoSettlementIntent(getIntent()); -// BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar(); - BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); + BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar(); +// BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); } @Override public void onStop(){ super.onStop(); BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); -// BaseApplication.getInstance().deviceEngine.getPlatform().enableHomeButton(); -// BaseApplication.getInstance().deviceEngine.getPlatform().enableTaskButton(); } @Override @@ -563,9 +559,6 @@ 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(); // Clean up RxJava disposables compositeDisposable.clear(); // Reset screen mode diff --git a/app/src/main/java/com/utsmm/kbz/MainFragment.java b/app/src/main/java/com/utsmm/kbz/MainFragment.java index 4d7d56b..3651273 100644 --- a/app/src/main/java/com/utsmm/kbz/MainFragment.java +++ b/app/src/main/java/com/utsmm/kbz/MainFragment.java @@ -160,18 +160,10 @@ public class MainFragment extends DataBindingFragment { NexGoSDK.getInstance().cancelCheckCard(); NexGoSDK.getInstance().closeReader(); enableHomeButton(); -// enablePinPadSound(false); -// disableTaskButton(); -// BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar(); -// BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); + }); } - -// private void enablePinPadSound(boolean flag) {n -// int result = BaseApplication.getInstance().deviceEngine.getPlatform().enablePinpadBeep(flag); -// LogUtil.d(TAG, "Pin Pad Beep Result:" + result); -// } - + private void disableHomeButton() { int result = BaseApplication.getInstance().deviceEngine.getPlatform().disableHomeButton(); LogUtil.d(TAG, "Disable Home Button Result:" + result); 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 136ab3f..009c5ea 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 @@ -42,8 +42,7 @@ public class RefundCertificateManager { return; }; -// String downloadBase = tmsAddress.trim() + "/api/v1/file/download?filePath="; //local - String downloadBase = tmsAddress.trim() + "/file/download?filePath="; // uat and prod + String downloadBase = tmsAddress.trim() + "/file/download?filePath="; String certUrl = SystemParamsOperation.getInstance().getCertificateUrl(); String clientCertUrl = SystemParamsOperation.getInstance().getCertificateClientUrl(); diff --git a/app/src/main/res/layout/fragment_capture_card_screen.xml b/app/src/main/res/layout/fragment_capture_card_screen.xml index 72c9d20..3445f63 100644 --- a/app/src/main/res/layout/fragment_capture_card_screen.xml +++ b/app/src/main/res/layout/fragment_capture_card_screen.xml @@ -142,6 +142,7 @@ android:weightSum="3"> + CExV^d;hPmbH3-E=lq^?p8MQ;&vWlNzuz@CW#1t}e6Tc!O_I#-Y=us3J z4J2*oyCGIisOO!f--n4yOz0lVAIKfJIAE8mIxC@VOhqQ<*_Iv67vK%I4g! zAACSQq<$$t!=rly|J1SU!;nS(?CXp4#Hhkz`1!V(4F{(hk(Xch?*stnY+cg znjX3D>BXaYPdu~o^moF_Jx*QcPBO{ueYZVz@sFJIRwkby0^IXV>hc%$$2Jy@Nutv@ z-}Th{?f#PM$(1Eq{*Yrd^@qI=k2Hot?LeaJe}kX0asQ3)sfvDByI>LuehW*AJBS`XR>d#h0_9m4Es#w&8J1VLZ^&7Rr1XBH3LVlZS|{8e>~cd% z84Dfn?o9e1Y``6*712XbZtK`SK|A2|;H3TKpj^=n>#YYCbd!!qpTJjxBth?mr|%gV zjl=E<9AxlKEn7hd+LcGs)Mj50=@W8Fi!qRjtE7FF1b@9IjUsr^$`y0WK9svWA(^S} zWG&@#A#bg1gf$m^aCQs_IaR)1K?LQzfWJJlK}z}JD`i-AMoWyFhjM0K*E*pQ67+2o z@?$3gsdzU|#dN-Nl5?G?{AAM-STS?$1{&jHsYtGDC^EjD`f}HYc zOqZ6EM}AFYz5A`wHvt-td?JK<(X~CtKJ){RRx{#3k9aF z7ZWeRXye)r>F+Ebf7u**_v&NnrX0GGejTZt2#9xmt4zJoPrW9i04?6$j2U`ch%%#3 zBOobiI`G`Ftfo@o;?c31K>!mac;ROcS+CD9@+E4Ap0ZSo71)z`F{-%D|?_wGu$#i83SyjpfdT_EXM)AayLgCkoWZ^9%@5Q;o`5~*cczu$w z|0WGT^7$OvCvH1Ka{f!~uHrrZl#1h(qczJ0;^UrOvX6M7M?U{x_Kpr&t}>)R{Ji%Sg6`BsSv=Hw(E7|QmrvLCVu$fc zKC^^~ll;R1u!A0#2hGs7wj2&Kt#vics~;lXzUcDw-r*d|E**^v=M=9xI)O?bPM9HH z8WGIa@gyQM=G5F**dx89>Vr$w7*?oE0gaVAeJ)#NYTNiZmT%5X)In0C_#30NTS9eaZn`$dH#YpnOPQezT(Lm&P!0Dje@RxxOP$Ye&L)b@J5giHf z9pRbWr`sUaq3J%AL1s>3!tte}+rh@-vtfGUY~<}|ppJXz6;5z4Ojbmb{+b_kj=w#9 zp{wkwIQ`M4UKXDpg!jc{Epj**+tkD@fgaILch+tQ1A*ppYRN>!sU|%oUHsD2WCuiZ ztX2ghMJ=o?&p4i{H6fd-?LY#!kBwd&cJO)S_dqdF@98!QST z!+OBjEPl7ejJMa#;9=xhJyfytt&vUvu9Okmb@cM`U_3s99q;<5tGH(4%gauR4*koU zt{dlbh=E8)oXCHT?^)0VZtA=bIvAj z&RWwC1IV~2S2^mu$h*0Iui&8Iw^i5@O;xl#&MSPg4sZKhu)v47WP9FBOmzuHz>F_& ztfARcVWE>B#YFt{z>N*(2q_aHs#0q7#tLF4lnZ;bo@?1?fp(zeig@bmL<|!lh^mDI z;9d}Pd?^>Si8*ZqBkgf1Io~@gMjfyq`0Ym2tqliod{L^6GWN71y|y$Ovz@x3ijKmi z9ZFw!wU^v2WeX7qJ@X{Zbcs?QFqanvp#pb`)H;cWa!~wwEetW&veeaD&KJ7z_w4dx zf7H~p_r+W1##A*d?QoHaJ&A>~8h5d8&ugE>JtSG&-jIfj+fXl_?gK17Z%xjHG(NU` zfmk#Wa}7l`IAQxO6M)#~u2KI=3@iI|(F#q>(opkO`8v(jNf>|0{U7=9ONFqYX4}qANYAS1 zciyZ(a55?rMOyoJkA&Fn5<{z#CwKKcDZ7ES3q8ym_tqMSQIZ;X`K_vV8QGG-8>L%! z7t%Hrg3PL$b^)YZDQR<4uKms?z`Oz;03es;=KoXY^0DOVUY+X>EC@Cqk zMC%upgk{N6KmhQjg_Z{!R7iqW$&h>egw4=IM80#M3ol&%LOln9L-T|C$o2R7@F&ME zC_Xu9V%AC-pl8d`GSyWUm|tqxzxrRMdC&q&hN{~`A=}wtu$T?Fo;bSFpWeV*Voa8C zj3-zej9L1VtrRNi=jN3iD{YVPTdb1o2(BsWj(CZBMA%MTeN9MZ4{YG}mpApZRXTqB zw&DeY+tfBC(7i0nJCX|TKeyT&zWj?>j2V&OG~|F;3(6TCLWJxJ!-~q6Z_r<_NoLFv zv9Xy~IuJeGX$}v`^J-s{yOuF)#@8%WHJndk1*`4b233$*kB}ODkRMC@VS;gWA|^ju z*97FU!qMfowv6e?JX-+x+v>@ZYw#wZB*HUG?WR{A*LJE8AP?Zf?rK`7_PN M8uwVJ^7l^v0R!;v*Z=?k literal 1923 zcma)72~bn#7QP9fiEO1vgR%sqC5i-+u#`mtEss(}X($NfK}{%xMfLhG02ESv;u(Tw_y1n z3EW184)J1*X=h_#r;4GKmBl(!FqR0a^RnRQ;Bw3JROB&@MD{K+fgN?|CMy2zqeIbQ z!CDL6t3x@aH1yyOxRomEVAUweXD6{#xWfFvkN@SYw5idsgC%^UX{(>DJNzSbfDU=Z zCKUu8G8Sg7_Bz>>FG#pd>VF z&U~0Ti@k2P+vjxr#f$b<=TGe3l?=Bc{iNaWRmfQHu?G|L5)A%{=d`RP+3DrlI_ELh zRcrOp;fB(psN(}4L3b^3-rHUDi-yQ2m~H8M**z|;mN=M}n0(dD0Aan~Tl^0X_1`^l zE42S^PpLsz%&1{!P@SS|YWlmPJjuCQtrZlvrYeKQ?4Q4WB=ox*B^53OnvJ6rdUK#= z{LSS9&6aZOBn!p};=_ep7JY0$s_a6%6t)&swl*hCR+Wl#SK{~FY42}qLJAQqMJ=ji z=36&+n>}XT7crsY1F{R9)pz*tbJ5@uEQ1wf|7Txw zhi}gswky|i2Itx6y$AWtb4HkL`Qxu8IyU!~9<=PH zc0APYdaiVvk}+qHF8DnpZeR;p{}$@uV7c3g*1USJsRy~ zZKdWYzuExh7@0ahd<)U4nAzV)3E+Rht=+TUzYqPYb3(WlB}A{zhj2b}9p~X0jMx4R zGtz70v%T}ty(+w@yom&F_AeXILTRGot9g1MYI-pN(2w8n<&I-SwC}r7|2cDztefOS zOL0Fs2eaRQAt%yujon?xh~JqsiK@zmN4N-{VL^HWm?}#)2!cKqvL0{CX~kI z-d?$%HapcCSr;8TDabsqZ{n2Hf5`DczTyL}AdH6=EPB5(xh;1QFm;Z$=@k3lPrQx5 z$6Vs)r^}R%)tWfmGEH{Z*us`d^~=EIv#4(}wRt)Y?U#Aib>$3F;T0y@bns+wuuJq< zAD`8zT%QSK4#(W-^1qWL+}U2{7=jef7|SR5&Z_d4^z4NZhlMN4&K|EnuGXVf?{FK; zQ?zZv&8`UF*jA>C*A(+YWn1mp1t#)@Q&n-&NSN!<#ZM$bilC*nVZ(-~>aL;iFEHL( z<0M(eHQhJ?TQdJR<9y>-g#s(=5x>~keSzB-k!8qfK^8~+(w&1n!bO>Q<{y=3oK_kw z-Q^0J4AmIUPwh|{b8G45RqhFW1A-DPp0c>i;G&-JdC#`GNc9A=eb?MF1mQJv^@k-Q z*Bfp>f6Cii!AH>6$Ch|`g(;y$Dn%^wGN+;N49`Gcp{!Rq84gquGwqPw4CJ)NxvtxC ztZem+5=tGl?U7HOp~v?rkC!r4yuf1TO9A7r1)~TFQZ%(}Am@a-v^uu-%0-P!?hG}* zuC9C2Mxi`IPGZyMssB%&=mv#n;>jh;0kt))E2o3Ic9}u{U+?3or*SP9Y;kRBk*y*5 zF~Vu_dkB3VNTr(#I7;&p8-njvn0k)Va~fRP6CeoxRUNd!#lBe`5+G#&?e=n1QV)#==5P_mS^sX6{}`umA*Dt<&|`=#02!q?`l(QyBnv8;qrKb)WCvulwD5&-=X3Iq!3pKYr(&_xYK_SXlW0?Ck6Szq@5{z%Rmi zX!{{OyVJ&(6S(J_;we(8U&z1G~u!z0su28rz z$zfvR>?@zXXIU>i^gdU$`Vu>V$^*EADASZPudFJzZ#CEMnQ`Zn+k(&!jLMbG&Gm=E zwJT&K$7`W2;JeSQ99|$h_^d!$<06?W=B}dXT%ZCKf8O*)V&)7Ggmd&PwX7W`WGO(C z`zzi+k1|H_wIwfpZx_hq4Vih_{E;)rf`LxklR6%@6byX>MA~SoO?D;5L1~ZIyAzj;Z8p- zQ$3^8^(ff|v=DWY_66D??eb#bz)NyG+^KsSctGF!u4`aQF9BAupvb!7-D@Rc8gxx6 zhuSPRn2@$3G+zx?+hy^Xz2?*kB*Yaq2A9Jkkfa#yv|HWX*2_uQv9}nD!0u?J=sWme z631eVin9q=9Ejbkmfd1AQx8P978hcJ{33qTWYj2klWZkWESf{|@v@4q(#UU<-Nm=A&lwiSO(2|1`r&p7 zg@Dahz6%^F!XhHU;S*p&28F{6Oe!@o6GM5LE)TglFbZeK4XXH|)Fjomva+C7pL*(^ z%~b9Pexyi^PRGC%m)ELOqqyYjQaTf)_t$p@v7|~4t>YU2UTR?4L#O$|dmyp>kmR-T zxYSVDbF~8D-8+mvRr&{X#rJ?c`O**CTJ|RO;!4+Sq<5O6$^yh?ouKp7qb(iWs(Crn zt5Na<*pHcLV*akk4YE8SIgfj_021VDVc)#AgOaQS1{-};*@}bYYoPakct(9 zhP>ca`RsQ6V{8cBZ2(0YdMWVZThiBkG|fYNGzQcW;#WmEmz9?m$djaWV;-gdZY}(D zE$C~KZPz@_sW_l4{vuC2F>)QEd<`N{E@3F@jwIuR zJR)kee=`XL4grf4?=Jp)PFS!{F7EFY^r69sl^6Zk)slMaa3H^VUH zifH?+fp_g^4Wr2$#ETn7SG*UVoWb|lSmX4`J#h&vdA%r4b?j&qXhIQJnw8s&yNIhi z!+)XWxqI|g0cT02jdBy~!O7c!myNH?M*2%CGJcQjHIf>#p1p9f9Wy1z%E_eLcKn}e z=DW_!P|hay456VX^auw;UYJt{UTWMaqPxpw(2B<~%K*y~6+ zcQv(S&}a7u2Jv-w`6)}N%U1bLL#mV}?^ePhh%C&KP%4*=!WKDa>Kxrue+avgYmi6I zDeSM0-!1smNk6le^!jKt_0$)x`Fo|)xYAcEJ7^zYqHlIjjBZ%<(xAZhYvm(ib8*ED zWi&+%-RG2nMxaAKW2W?o0&R40nIjt4h^Rj|v86LoB@X+*knS)Y!A4X`eTnuo-4U~LVCe2GPPlKcRpCdkl&^kTzsD+x&-Eg038#Fi#+YjF2ww+ z+OOt;B<(dQSB0=XUU$?^7Qqe+LPdf29NLw)#SQP{WS_Uiear68x0nR$qf!hX+cK!r z_HRcsGh9{euHB=RJfqvJ;(HjuD35p<)n=JNp^hJ3A~}N0b4`j{8&+|V+1Y%SeYw&%EYkjD^sSW_YG1` z2O|SDP&ycboACCFzN+Ag5fifrwWO4b%&p}RZH=-#Ewt_&EJBH7wBEow4)hutgSgbk* z%ayGh96O7Akgw>8c|@R;7R)(%mna~WybCh&ZQK!YtA)?l+=^6~5k9^rHO-quwB^nt z(WmIQUW( ziuBahMV9rampuyMnoFB=!2}J{-hk~Tgv8^W9+Ei9{bsL#ChB%=H#vOXtY}K4NBR@& zm{LtRlJqv|072Z)DW(-~1uV4JRhWI*&88q^>h*)Ak0!dYwx+;$xSNBOx^F%JVj zSins*WY|SpDqdBL+rp*Uq`pB_Zo|p#@=SSHP0~<%T0k%6lK0H01SlR~4X)ZZc@Y+C zcK6SXfg7+lCS$Hu?#_&@zL^-fRh(lH{5kQzHtI0Cjh%UY%_>AfE#q&1MalCBZO7l~ zqz;Mx%M<0VSIpOFAG%EZ&P`~3uc_GO53a2HA64BXOq$BJ&n?&O@Ji zuyO!CF{X0d90p{+bZnU7c*rU34zKzD<)vJIORc!e4wNW<98&^bo5jhncp1`w`nCYB=v1`zCF(^fUT0=@+2a`#w&R z%cQ1CRTNiuCfZoO2AfX#OrdJOv<^gq_sc+_lQy9Cns2o6;tq~ltPS%`0UnU>kA3ullm#`z`X5E%B128uWuwt3lh5 z;Ud?Bt`+64`JcXrZW-HIDnUFhpm|$e`ll70o+dg$@Ld8dZ3HYWEdeyGI2u@E?-}zn@DMEl%=SzJk5Ei1%nmOa699!q0g$bQ08n5C0LM&T z@nZ|a$@V=0Iwdo!F?OyF(fmQPcqBz`5ok>t?5RsW6rOlKBjIP!EqKSl7s7}n$KGcW zZN6uLBng>sT~PLYZ&2CxkIrsgbS9j{rv7B+ZFjV397kW#YEf}VZF?7SeSSJUHeRP+ z>F0{Q#`z;Yio~TTnY4ZN&|w`}Ol4aH2eE>Fd4{3L-Siyx@aQx( z8Qdw$4x{8eUAn0xs2q>*-3_OTk3Afj^tge>rCc^;?4?si25Vf*p_trWvzZGp?a4E; zyE{LLzh4QbgP$`|tdiq~1n32*cZZ5a`iF$<)+~(gf=Hpf;#70!}}#>!0G6`==yG z2EEQA<78h@m6g~Qp;cMC zQZJB{L0|-Kc~HNruT`@Jose7UCo|<@=N6N@0}xVT9Ez*+kafI4p0UxSw>}(TN4y~A z`}4ok*Q?IS(dP8YoR~32#|jC{k4LW#s;?y5Xy1EzE>}qpdL(!nuje{0$bl%$v?-!D z^qfDHW>&m;UJhNnD1(CxH{oXXlc#*5hEzs+hOxGi~vnCCabv!AV*~QHrvr`7mK&SyMJ< zSP;O~VA0hgefR6Lh!EN7EwS9xzqhRt1~f1a$pMEGs6DyE<_c^sN1gf6FS$pweGGs4 z6BRRNzQwh%8XGnjU0LziF(Q4gi328|)=?X`MWvp?gk6T`$@h*5MDn&zuI^j+?|?sd zksqYGT{Phy`eM3%Yh&Jo>7#9p!ad_#C@+8Pk3ZO+e=YRCeWOyB`r{9>9*v8yxJzjU zUTO1nL&SL3lGDu3uoh;@a`Vz#`GcX%#O`lXqtB``INfBtI%_HGc22E^qgE=e`*Xe0 z+^&}o-LCm2Q>CptoFziX`a$IPi+?*$JbW$vGn4utqbzihN?4sBaiQ-kT3q**t@ zbxrN$FI;>_CsUR{w#}u@oc7GIE2{orIt`q*TCLomcQay`>8fX!MB1{6$5D`D0i-`+shZ&?XlUpM?$%>L=UC>iqMKb-369_81r zwTQIg>F+y3{$Eeax1EP?kpE~yz*|^~MJAIxqaIfngYcJ{4*i3s(@b~(c{L5B0Vos( zfB+N5x>4ATs!k$~QaO5A3N8+`i_;~?4gmtwVgBq-pu@68Dd-+#$EL5=|9hEET8}Y diff --git a/app/uat/release/output-metadata.json b/app/uat/release/output-metadata.json index 8b7cf73..b498057 100644 --- a/app/uat/release/output-metadata.json +++ b/app/uat/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "SINGLE", "filters": [], "attributes": [], - "versionCode": 1, - "versionName": "1.00-uat", + "versionCode": 33, + "versionName": "2.13-uat", "outputFile": "app-uat-release.apk" } ], diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java index 942b6a1..f9feb9a 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/TerminalKeyUtil.java @@ -21,16 +21,8 @@ import com.utsmyanmar.paylibs.utils.LogUtil; public final class TerminalKeyUtil { public static final String TAG = TerminalKeyUtil.class.getSimpleName(); - - private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("B4D74774CC846CAFF6D1AAAC2EB79CFF".toUpperCase()); // KBZ UAT -// private static final byte[] main_key_usd_data = ByteUtil.hexStr2Bytes("3f4bcac6cc559ab12bbbc5a51118f3f5".toUpperCase()); // KBZ UAT -// private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase()); -// private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // MPU + private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("".toUpperCase()); // KBZ PROD private static final byte[] work_key_data = new byte[16]; - - - - public static void initNexKey() { byte[] IPEKByte = ByteUtil.hexStr2Bytes("5A4CFF6DE93F0488926166F3317EFD2F"); // IPEK byte[] IPEKKCVByte = ByteUtil.hexStr2Bytes("1F0C18"); @@ -54,8 +46,8 @@ public final class TerminalKeyUtil { // int result = pinPad.dukptKeyInject(9, DukptKeyTypeEnum.IPEK,IPEKByte,16,KSNByte); // int result = pinPad.dukptKeyInject(9, DukptKeyTypeEnum.BDK,IPEKByte,16,ksn); - LogUtil.d(TAG, "save tmk key result: "+result); - LogUtil.d(TAG, "save tmk kcv: "+ByteUtil.bytes2HexStr(kcv)); +// LogUtil.d(TAG, "save tmk key result: "+result); +// LogUtil.d(TAG, "save tmk kcv: "+ByteUtil.bytes2HexStr(kcv)); // byte[] encryptedPIK = SystemParamsOperation.getInstance().getKeyPIK().get(0); // 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 c8732f3..426b8a0 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,8 @@ public class NetworkModule { } if (baseUrl.isEmpty()) { - baseUrl = "http://api-uat.kbzpay.com/payment/gateway/uat/"; +// baseUrl = "http://api-uat.kbzpay.com/payment/gateway/uat/"; //UAT + baseUrl = "https://api.kbzpay.com/payment/gateway/"; //Prod } return new Retrofit.Builder() .baseUrl(baseUrl) @@ -310,8 +311,8 @@ public Retrofit provideKPayRefundRetrofit(@ApplicationContext Context context) { // char[] password = "test123".toCharArray(); -// String refundBaseUrl = "https://api.kbzpay.com:8008/payment/gateway/"; - String refundBaseUrl = "https://api-uat.kbzpay.com:18008/payment/gateway/uat/"; + String refundBaseUrl = "https://api.kbzpay.com:8008/payment/gateway/"; +// String refundBaseUrl = "https://api-uat.kbzpay.com:18008/payment/gateway/uat/"; // String IpAddress = SystemParamsOperation.getInstance().getSecHostIpAddress(); @@ -325,7 +326,7 @@ public Retrofit provideKPayRefundRetrofit(@ApplicationContext Context context) { String pass = SystemParamsOperation.getInstance().getCertificatePassword(); if (TextUtils.isEmpty(pass)) { - pass = "test123"; + pass = ""; } char[] password = pass.toCharArray(); 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 c361087..55d8cb8 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/network/KPayApiService.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/network/KPayApiService.java @@ -3,15 +3,10 @@ package com.utsmyanmar.baselib.network; import com.utsmyanmar.baselib.network.model.KPayQRQueryRequest; import com.utsmyanmar.baselib.network.model.KPayQRRequest; import com.utsmyanmar.baselib.network.model.KPayQRResponse; -import com.utsmyanmar.baselib.network.model.MMQRStatusResponse; -import com.utsmyanmar.baselib.network.model.WaveQRRequest; -import com.utsmyanmar.baselib.network.model.WaveQRResponse; -import com.utsmyanmar.baselib.network.model.WaveStatusRequest; import io.reactivex.rxjava3.core.Observable; import retrofit2.http.Body; import retrofit2.http.POST; -import retrofit2.http.Url; public interface KPayApiService { @@ -23,13 +18,13 @@ public interface KPayApiService { Observable checkStatus(@Body KPayQRQueryRequest.QRQueryRequest waveStatusRequest); - //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); + //this accepts "url" bez this api start with https and other are http in uat +// @POST +// Observable closeOrder(@Url String url, @Body KPayQRRequest.CloseOrderRequest closeOrderRequest); //this 2 is for production -// @POST("closeorder") -// Observable closeOrder(@Body KPayQRRequest.CloseOrderRequest closeOrderRequest); + @POST("closeorder") + Observable closeOrder(@Body KPayQRRequest.CloseOrderRequest closeOrderRequest); } 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 f1de488..011203c 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/repo/Repository.java @@ -86,9 +86,9 @@ public class Repository { } public Observable qrCloseOrder(KPayQRRequest.CloseOrderRequest request){ - String url = "https://api-uat.kbzpay.com/payment/gateway/uat/closeorder"; //close this in prod - return kPayApiService.closeOrder(url, request); // this is for local -// return kPayApiService.closeOrder(request); //this is for prod +// String url = "https://api-uat.kbzpay.com/payment/gateway/uat/closeorder"; //close this in prod +// return kPayApiService.closeOrder(url, request); // this is for uat + return kPayApiService.closeOrder(request); //this is for prod } public Observable qrStatusCheck(KPayQRQueryRequest.QRQueryRequest request) { 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 5e4fb19..a1a5e22 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 @@ -39,13 +39,9 @@ public class SystemParamsSettings implements Serializable { private boolean manualEntryPinEnable = false; private boolean checkExpSwitch = false; - -// private String tmsAddress = "https://tms.smile-mm.com"; -// private String tmsAddress = "http://128.199.170.203"; - private String tmsAddress = "https://sirius-nest.utsmyanmar.com/api/v1"; -// private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius"; //for uat - private String ereceiptAddress = "https://receipt-nest.utsmyanmar.com/api/v1"; //for on prime -// private String ereceiptAddress = "https://api-tms-uat.kbzbank.com:8443/receipt"; //for uat + + private String tmsAddress = "https://api-tms.kbzbank.com/sirius"; + private String ereceiptAddress = "https://api-tms.kbzbank.com/receipt"; private String binValues = ""; From 781d7a0fceae6a0d5bf14c7e99a749624c34397a Mon Sep 17 00:00:00 2001 From: kizzy Date: Thu, 7 May 2026 12:49:59 +0700 Subject: [PATCH 05/14] fixed for preauth comp cancel not allowed emv cards From a04e008c5b66ab4b183c2a55e30ad5c136ed087a Mon Sep 17 00:00:00 2001 From: kizzy Date: Sat, 9 May 2026 19:41:23 +0700 Subject: [PATCH 06/14] fix for settlement total amount alignment --- .../java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2c616b0..1eb0046 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 @@ -306,7 +306,7 @@ public abstract class BaseXPrint { print3ColumnsString("CASH ADVANCE ", countStringFormat(summary.cashAdvanceCount), PrintUtils.getInstance().getSeparatorNumberFormat(summary.cashAdvanceAmount, isDecimalEnabled)); } print3ColumnsString("REFUND ", countStringFormat(summary.refundCount), "- " + PrintUtils.getInstance().getSeparatorNumberFormat(summary.refundAmount, isDecimalEnabled)); - print3ColumnsString("TOTAL(" + currencyLabel + ")", countStringFormat(totalCount), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled)); + print3ColumnsString("TOTAL(" + currencyLabel + ") ", countStringFormat(totalCount), PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled)); } private void applyCardSettlementSummary(CurrencySettlementSummary summary, CardSettleData cardSettleData) { From 77b8d1956a104de3b27f679b5edfd57ecfc1d395 Mon Sep 17 00:00:00 2001 From: kizzy Date: Sat, 16 May 2026 22:55:51 +0700 Subject: [PATCH 07/14] MPU contactless finished / if amount is exceeded 100000 MMK , will route to card capture to proceed chip --- .../baselib/viewModel/EmvBaseViewModel.java | 173 ++++++++++-------- baselib/src/main/res/raw/contacts_config.json | 50 ++--- baselib/src/main/res/raw/mpu_ctls_config.json | 2 +- .../src/main/res/raw/quickpass_config.json | 1 + baselib/src/main/res/raw/rid_config.json | 18 +- 5 files changed, 139 insertions(+), 105 deletions(-) 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 d613ee9..8bdf03d 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -26,6 +26,7 @@ import com.nexgo.oaf.apiv3.device.pinpad.PinPad; import com.nexgo.oaf.apiv3.device.pinpad.PinPadKeyCode; import com.nexgo.oaf.apiv3.device.pinpad.PinpadLayoutEntity; import com.nexgo.oaf.apiv3.device.reader.CardInfoEntity; +import com.nexgo.oaf.apiv3.emv.AidEntity; import com.nexgo.oaf.apiv3.emv.CandidateAppInfoEntity; import com.nexgo.oaf.apiv3.emv.EmvCardBrandEnum; import com.nexgo.oaf.apiv3.emv.EmvCvmResultEnum; @@ -178,7 +179,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { protected int mProcessStep; protected int mAppSelect = 0; - + private boolean mMPUContactlessConfigured = false; private Looper mLooper = Looper.getMainLooper(); private final Handler mHandler = new Handler(mLooper) { @Override @@ -213,6 +214,8 @@ public abstract class EmvBaseViewModel extends BaseViewModel { public void startProcess() { isOfflinePinEntered = false; + mMPUContactlessConfigured = false; + initData(); // Check if initialization was successful @@ -272,10 +275,12 @@ public abstract class EmvBaseViewModel extends BaseViewModel { transData.setUnionPayTransDataEntity(unionPayTransDataEntity); + setTransactionLimitForMPUCtls(false); // emvHandler.contactlessConfigKernelId(EmvCardBrandEnum.EMV_CARD_BRAND_JCB,(byte) 0x01,ByteUtils.hexString2ByteArray("06")); - emvHandler.contactlessAppendAidIntoKernel(EmvCardBrandEnum.EMV_CARD_BRAND_MASTER, (byte) 0x08, ByteUtils.hexString2ByteArray("A000000732100123")); + emvHandler.contactlessAppendAidIntoKernel(EmvCardBrandEnum.EMV_CARD_BRAND_MASTER, (byte) 0x07, ByteUtils.hexString2ByteArray("A0000008890101")); +// emvHandler.contactlessAppendAidIntoKernelFirst(true); LogUtil.d(TAG, "TransData :" + transData.getTransAmount()); LogUtil.d(TAG, "start emv "); @@ -329,76 +334,6 @@ public abstract class EmvBaseViewModel extends BaseViewModel { } } - private void initPayPassTlv() { - emvParamOperation.retrievePayPassData(new ProcessSingleDataResult() { - @Override - public void onSuccess(PayPassEntity data) { - - String DF8117Value = "E0"; - String DF8118Value = "F8"; - String DF8119Value = "28"; - - if (!data.getTerminalCapability().isEmpty()) { - DF8117Value = data.getTerminalCapability().substring(0, 2); - DF8118Value = data.getTerminalCapability().substring(2, 4); - DF8119Value = data.getTerminalCapability().substring(4, 6); - } - String DF8123Value = data.getFloorLimit(); - String DF8124Value = data.getTransLimitCDV(); - String DF8125Value = data.getTransLimit(); - String DF8126Value = ParamHelper.getInstance().convertPaddedString(data.getCvmLimit()); - String DF8120Value = data.getTacDefault(); - String DF8121Value = data.getTacDenial(); - String DF8122Value = data.getTacOnline(); - - String[] tagsPayPass = {"DF8117", "DF8118", "DF8119", "DF811F", "DF811E", "DF812C", - "DF8123", "DF8124", "DF8125", "DF8126", - "DF811B", "DF811D", "DF8120", "DF8121", "DF8122"}; - - String[] valuesPayPass = {DF8117Value, DF8118Value, DF8119Value, "C8", "00", "00", - DF8123Value, DF8124Value, DF8125Value, DF8126Value, - "30", "02", DF8120Value, DF8121Value, DF8122Value}; -// try { -// mEMVOptV2.setTlvList(AidlConstantsV2.EMV.TLVOpCode.OP_PAYPASS, tagsPayPass, valuesPayPass); -// -// LogUtil.d(TAG,"<<<<< PayPass TLV data are successfully setup >>>>>"); -// } catch (RemoteException e) { -// throw new RuntimeException(e); -// } - } - - @Override - public void onDataNotFound() { - LogUtil.d(TAG, "PayPass Data not found!"); - } - }); - } - - - protected void increasedKSN() { - pinPad.dukptKsnIncrease(pinIndex); //3 - - LogUtil.d(TAG,"DUKPT KSN Increased!"); - } - - private void getKSN() { - try { - - byte[] result = pinPad.dukptCurrentKsn(pinIndex); - if (result != null) { - String ksnStr = ByteUtil.bytes2HexStr(result); - LogUtil.d(TAG, "ksnStr: " + ksnStr); - mPayDetail.setReference(ksnStr); - mPayDetail.tempKSN = ksnStr; - - LogUtil.d(TAG, "final ksnStr: " + ksnStr); - } else { - LogUtil.e(TAG, "Result code for current KSN:" + result); - } - } catch (Exception e) { - e.printStackTrace(); - } - } private String getTransactionType() { String trnxType = "00"; @@ -600,13 +535,21 @@ public abstract class EmvBaseViewModel extends BaseViewModel { @Override public void onTransInitBeforeGPO() { + + if (mMPUContactlessConfigured) { + LogUtil.d(TAG, "onTransInitBeforeGPO: skipping — MPU contactless already configured"); + emvHandler.onSetTransInitBeforeGPOResponse(true); + return; + } + byte[] aid = emvHandler.getTlv(new byte[]{0x4F}, EmvDataSourceEnum.FROM_KERNEL); - LogUtil.d(TAG, "onTransInitBeforeGPO :"); + LogUtil.d(TAG, "onTransInitBeforeGPO :"+ByteUtil.bytes2HexStr(aid)); String visaTerminalCapability = SystemParamsOperation.getInstance().getVisaTerminalCapability(); String masterTerminalCapability = SystemParamsOperation.getInstance().getMasterTerminalCapability(); String upiTerminalCapability = SystemParamsOperation.getInstance().getUpiTerminalCapability(); + String selectedTerminalCapability = ""; if (aid != null) { @@ -621,6 +564,9 @@ public abstract class EmvBaseViewModel extends BaseViewModel { } else if (aidStr.contains("A000000333") || aidStr.contains("A000000025")) { // UPI selectedTerminalCapability = upiTerminalCapability; + } else if (aidStr.contains("A00000006510") || aidStr.contains("A0000001570040")) { + // UPI + selectedTerminalCapability = "E0F8C8"; } } @@ -640,12 +586,15 @@ public abstract class EmvBaseViewModel extends BaseViewModel { configPaypassParameter(aid); } else if (aidStr.contains("A000000003")) { configPaywaveParameters(); - } else if (aidStr.contains("A000000025")) { -// //imp + } else if (aidStr.contains("A000000333")) { + configureQuickPassParamerter(); } else if (aidStr.contains("A000000541")) { configPureContactlessParameter(); } else if (aidStr.contains("A000000065")) { configJcbContactlessParameter(); + } else if (aidStr.contains("A000000889")) { + configMPUContactlessParameter(); + mMPUContactlessConfigured = true; } } } @@ -1267,6 +1216,75 @@ public abstract class EmvBaseViewModel extends BaseViewModel { } + + } + + private void configMPUContactlessParameter() { + LogUtil.d(TAG,"MPU Contactless Parameter configurations...."); + //kernel configuration, enable RRP and cdcvm + + + emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x1B}, new byte[]{(byte) 0x30}); + + //EMV MODE :amount >contactless cvm limit, set 60 = online pin and signature , set 20 = signature + emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x18}, new byte[]{(byte) 0xF0}); //F8 + //EMV mode :amount < contactless cvm limit, set 08 = no cvm + emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x19}, new byte[]{(byte) 0x28}); //08 + + emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x24}, ByteUtils.hexString2ByteArray("000010000000")); + emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x25}, ByteUtils.hexString2ByteArray("000010000000")); + emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x26}, ByteUtils.hexString2ByteArray("000010000000")); + + + + emvHandler.setTlv(new byte[]{(byte) 0x9F, (byte) 0x1d}, ByteUtils.hexString2ByteArray("6C00800000000000")); + + setTransactionLimitForMPUCtls(true); + + + byte[] getTLVofDF8124 = emvHandler.getTlv(ByteUtil.hexStr2Bytes("DF8124"),EmvDataSourceEnum.FROM_KERNEL); + LogUtil.d(TAG,"DF8124: "+ByteUtil.bytes2HexStr(getTLVofDF8124)); + + + } + + private void setTransactionLimitForMPUCtls(boolean flag){ + if(emvHandler.getAidList() != null) { + for (AidEntity aidEntity:emvHandler.getAidList() + ) { + + if(aidEntity.getAid() != null) { + if(aidEntity.getAid().equals("A00000000410") || aidEntity.getAid().equals("A0000000041010")){ + + if(flag) { + aidEntity.setTransLimit(Long.parseLong("000010000000")); + aidEntity.setContactlessTransLimit(Long.parseLong("000010000000")); + } else { + aidEntity.setTransLimit(Long.parseLong("999999999999")); + aidEntity.setContactlessTransLimit(Long.parseLong("999999999999")); + } + + emvHandler.delOneAid(ByteUtil.hexStr2Bytes(aidEntity.getAid())); + emvHandler.setAidParaList(List.of(aidEntity)); + LogUtil.d(TAG,"added AID+"+aidEntity.getAid()); + } + } + + } + + for (AidEntity aidEntity1:emvHandler.getAidList() + ) { + if (aidEntity1.getAid() != null) { + if (aidEntity1.getAid().equals("A00000000410") || aidEntity1.getAid().equals("A0000000041010")) { + + + LogUtil.d(TAG, " AID+" + aidEntity1.getAid()); + LogUtil.d(TAG, " transactionLimit+" + aidEntity1.getContactlessTransLimit()); + LogUtil.d(TAG, " transactionLimit+" + aidEntity1.getTransLimit()); + } + } + } + } } private void configPaywaveParameters() { @@ -1313,6 +1331,11 @@ public abstract class EmvBaseViewModel extends BaseViewModel { } + private void configPureQuickPassParameter() { + LogUtil.d(TAG, "configQuickPassParameter"); + + + } private void configJcbContactlessParameter() { LogUtil.d(TAG, "configJcbContactlessParameter"); diff --git a/baselib/src/main/res/raw/contacts_config.json b/baselib/src/main/res/raw/contacts_config.json index ec4fcce..0723d52 100644 --- a/baselib/src/main/res/raw/contacts_config.json +++ b/baselib/src/main/res/raw/contacts_config.json @@ -531,9 +531,9 @@ }, { "aidEnable": true, - "aid": "A0000000651010", + "aid": "A00000006510", "cardScheme": "JCB", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, @@ -553,33 +553,33 @@ "currencyCode": "0104" }, { - "aidEnable": true, - "aid": "A00000006510", - "cardScheme": "JCB", - "applicationVersion": "0020", - "emvDDOL": "9F3704", - "emvTDOL": "9F3704", - "partialAidSelection": false, - "targetPercent": "99", - "maxTargetPercent": "99", - "threshold": "00000000", - "tacDefault": "D84000A800", - "tacOnline": "DC4004F800", - "tacDenial": "0000000000", - "floorLimit": "000000000000", - "cvmLimit": 75000, - "transLimit": "999999999999", - "transLimitCDV": "999999999999", - "terminalCapability": "0000000000000000", - "riskManageData": "01", - "cateCode": "2701", - "currencyCode": "0104" - }, + "aidEnable": true, + "aid": "A0000000651010", + "cardScheme": "JCB", + "applicationVersion": "0030", + "emvDDOL": "9F3704", + "emvTDOL": "9F3704", + "partialAidSelection": false, + "targetPercent": "99", + "maxTargetPercent": "99", + "threshold": "00000000", + "tacDefault": "D84000A800", + "tacOnline": "DC4004F800", + "tacDenial": "0000000000", + "floorLimit": "000000000000", + "cvmLimit": 75000, + "transLimit": "999999999999", + "transLimitCDV": "999999999999", + "terminalCapability": "0000000000000000", + "riskManageData": "01", + "cateCode": "2701", + "currencyCode": "0104" +}, { "aidEnable": true, "aid": "A0000001570040", "cardScheme": "JCB", - "applicationVersion": "0020", + "applicationVersion": "0030", "emvDDOL": "9F3704", "emvTDOL": "9F3704", "partialAidSelection": false, diff --git a/baselib/src/main/res/raw/mpu_ctls_config.json b/baselib/src/main/res/raw/mpu_ctls_config.json index 3f6983e..3732939 100644 --- a/baselib/src/main/res/raw/mpu_ctls_config.json +++ b/baselib/src/main/res/raw/mpu_ctls_config.json @@ -14,7 +14,7 @@ "tacOnline": "DC4004F800", "tacDenial": "0000000000", "floorLimit": "000000000000", - "cvmLimit": 100000, + "cvmLimit": 10000000, "transLimit": "000010000000", "transLimitCDV": "999999999999", "terminalCapability": "0000000000000000", diff --git a/baselib/src/main/res/raw/quickpass_config.json b/baselib/src/main/res/raw/quickpass_config.json index 47b3a28..143a86d 100644 --- a/baselib/src/main/res/raw/quickpass_config.json +++ b/baselib/src/main/res/raw/quickpass_config.json @@ -26,6 +26,7 @@ }, { "aidEnable": true, + "aid": "A000000333010102", "cardLabel": "UPI", "applicationVersion": "0002", "emvDDOL": "9F3704", diff --git a/baselib/src/main/res/raw/rid_config.json b/baselib/src/main/res/raw/rid_config.json index 3673d0b..c99a4d7 100644 --- a/baselib/src/main/res/raw/rid_config.json +++ b/baselib/src/main/res/raw/rid_config.json @@ -250,6 +250,16 @@ "expDate": "3230333031323331", "checkSum": "BD331F9996A490B33C13441066A09AD3FEB5F66C" }, + { + "rid": "A000000065", + "indx": "07", + "hashInd": "01", + "arithInd": "00", + "modul": "B8DAB883EF1B5763E4F861F9EA3044B276635D402F3AE5E6B6C0547E368E79A36366DAC5609B6EC486DA1A8D2002CA4F4EFC2CB0EC1573A0B0917969EB60645BAEDF11C050C5D07FED817D11E84A174859A0DAE7F7935F109229C0AC4EE5BFB3D65533A679F0486C5AEFCC937379833BEC45D79DCF97B5228B1910FA03765331", + "exponent": "010001", + "expDate": "20201231", + "checkSum": "4896DD5A9EB5B11B9DCCA6DFE336C009F69F509A" + }, { "rid": "A000000065", "indx": "08", @@ -257,7 +267,7 @@ "arithInd": "00", "modul": "B74670DAD1DC8983652000E5A7F2F8B35DFD083EE593E5BA895C95729F2BADE9C8ABF3DD9CE240C451C6CEFFC768D83CBAC76ABB8FEA58F013C647007CFF7617BAC2AE3981816F25CC7E5238EF34C4F02D0B01C24F80C2C65E7E7743A4FA8E23206A23ECE290C26EA56DB085C5C5EAE26292451FC8292F9957BE8FF20FAD53E5", "exponent": "03", - "expDate": "3230333031323331", + "expDate": "20201231", "checkSum": "DD36D5896228C8C4900742F107E2F91FE50BC7EE" }, { @@ -277,7 +287,7 @@ "arithInd": "00", "modul": "99B63464EE0B4957E4FD23BF923D12B61469B8FFF8814346B2ED6A780F8988EA9CF0433BC1E655F05EFA66D0C98098F25B659D7A25B8478A36E489760D071F54CDF7416948ED733D816349DA2AADDA227EE45936203CBF628CD033AABA5E5A6E4AE37FBACB4611B4113ED427529C636F6C3304F8ABDD6D9AD660516AE87F7F2DDF1D2FA44C164727E56BBC9BA23C0285", "exponent": "03", - "expDate": "3230333031323331", + "expDate": "20201231", "checkSum": "C75E5210CBE6E8F0594A0F1911B07418CADB5BAB" }, { @@ -287,7 +297,7 @@ "arithInd": "00", "modul": "A2583AA40746E3A63C22478F576D1EFC5FB046135A6FC739E82B55035F71B09BEB566EDB9968DD649B94B6DEDC033899884E908C27BE1CD291E5436F762553297763DAA3B890D778C0F01E3344CECDFB3BA70D7E055B8C760D0179A403D6B55F2B3B083912B183ADB7927441BED3395A199EEFE0DEBD1F5FC3264033DA856F4A8B93916885BD42F9C1F456AAB8CFA83AC574833EB5E87BB9D4C006A4B5346BD9E17E139AB6552D9C58BC041195336485", "exponent": "03", - "expDate": "3230333031323331", + "expDate": "20201231", "checkSum": "D9FD62C9DD4E6DE7741E9A17FB1FF2C5DB948BCB" }, { @@ -297,7 +307,7 @@ "arithInd": "00", "modul": "AEED55B9EE00E1ECEB045F61D2DA9A66AB637B43FB5CDBDB22A2FBB25BE061E937E38244EE5132F530144A3F268907D8FD648863F5A96FED7E42089E93457ADC0E1BC89C58A0DB72675FBC47FEE9FF33C16ADE6D341936B06B6A6F5EF6F66A4EDD981DF75DA8399C3053F430ECA342437C23AF423A211AC9F58EAF09B0F837DE9D86C7109DB1646561AA5AF0289AF5514AC64BC2D9D36A179BB8A7971E2BFA03A9E4B847FD3D63524D43A0E8003547B94A8A75E519DF3177D0A60BC0B4BAB1EA59A2CBB4D2D62354E926E9C7D3BE4181E81BA60F8285A896D17DA8C3242481B6C405769A39D547C74ED9FF95A70A796046B5EFF36682DC29", "exponent": "03", - "expDate": "3230333031323331", + "expDate": "20201231", "checkSum": "43A3151513B7ADCEB92DBEA2A262CEB336D26C83" } ] \ No newline at end of file From d32dd1ce5b49b932ed8766fb1ca8f6338806c447 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Sun, 17 May 2026 09:22:00 +0630 Subject: [PATCH 08/14] jcb terminal capability added --- .../java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java | 6 +++++- .../baselib/viewModel/EmvBaseViewModel.java | 7 +++++-- .../utils/core_utils/SystemParamsOperation.java | 13 +++++++++++++ .../utils/core_utils/SystemParamsSettings.java | 10 +++++++++- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java index 25069fc..cad23ac 100644 --- a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java +++ b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java @@ -595,7 +595,11 @@ public class TMSSetupsImpl implements TMSSetups{ if(!data.isEmpty()){ SystemParamsOperation.getInstance().setUpiTerminalCapability(data); } - }else if (TextUtils.equals(name,"upi_ttq")) { + } else if (TextUtils.equals(name, "jcb_terminal_capability")) { + if(!data.isEmpty()){ + SystemParamsOperation.getInstance().setJcbTerminalCapability(data); + } + } else if (TextUtils.equals(name,"upi_ttq")) { emvParamOperation.updateQuickPassTTQ(data); } else if (TextUtils.equals(name, "upi_tc_enabled")) { SystemParamsOperation.getInstance().setUpiTCEnabled(parseBoolean(data)); 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 8bdf03d..c9dde08 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -548,6 +548,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { String visaTerminalCapability = SystemParamsOperation.getInstance().getVisaTerminalCapability(); String masterTerminalCapability = SystemParamsOperation.getInstance().getMasterTerminalCapability(); String upiTerminalCapability = SystemParamsOperation.getInstance().getUpiTerminalCapability(); + String jcbTerminalCapability = SystemParamsOperation.getInstance().getJcbTerminalCapability(); String selectedTerminalCapability = ""; @@ -565,8 +566,10 @@ public abstract class EmvBaseViewModel extends BaseViewModel { // UPI selectedTerminalCapability = upiTerminalCapability; } else if (aidStr.contains("A00000006510") || aidStr.contains("A0000001570040")) { - // UPI - selectedTerminalCapability = "E0F8C8"; + // UPI (maybe JCB) + selectedTerminalCapability = jcbTerminalCapability; + } else if (aidStr.contains("A000000065")){ + selectedTerminalCapability = jcbTerminalCapability; } } 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 7551ee1..8878da7 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 @@ -681,6 +681,12 @@ public class SystemParamsOperation { saveSystemParamsSettings(params); } + public void setJcbTerminalCapability(String jcbTerminalCapability){ + SystemParamsSettings params = getSystemParamsSettings(); + params.setJcbTerminalCapability(jcbTerminalCapability); + saveSystemParamsSettings(params); + } + public String getVisaTerminalCapability(){ SystemParamsSettings params = getSystemParamsSettings(); return params.getVisaTerminalCapability(); @@ -693,6 +699,11 @@ public class SystemParamsOperation { SystemParamsSettings params = getSystemParamsSettings(); return params.getUpiTerminalCapability(); } + + public String getJcbTerminalCapability() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getJcbTerminalCapability(); + } public void setAuthToken(String authToken) { SystemParamsSettings params = getSystemParamsSettings(); @@ -1926,4 +1937,6 @@ public class SystemParamsOperation { SystemParamsSettings params = getSystemParamsSettings(); return params.getAutoReversalEnable(); } + + } 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 a1a5e22..ea29373 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 @@ -51,7 +51,7 @@ public class SystemParamsSettings implements Serializable { private String visaTerminalCapability = "E028C8"; private String masterTerminalCapability = "E068C8"; private String upiTerminalCapability = "E068C8"; - + private String jcbTerminalCapability = "E0F8C8"; private String ipAddress = ""; private String secIpAddress = ""; @@ -1184,6 +1184,14 @@ public class SystemParamsSettings implements Serializable { return autoReversalEnable; } + public String getJcbTerminalCapability() { + return jcbTerminalCapability; + } + + public void setJcbTerminalCapability(String jcbTerminalCapability){ + this.jcbTerminalCapability = jcbTerminalCapability; + } + /* // 流水号起始 private String serialNum = Configs.getInstance().SERIAL_NUM(); // 批次号起始 From bab8390ba43662d6222477a112272020d8b93887 Mon Sep 17 00:00:00 2001 From: kizzy Date: Sun, 17 May 2026 15:01:40 +0700 Subject: [PATCH 09/14] MPU-UPI contactless is restricted, need to put it in db later. --- .../kbz/ui/core_ui/CardWaitingFragment.java | 9 +++- .../ui/core_ui/EmvTransactionFragment.java | 11 +++++ .../EmvTransactionProcessViewModel.java | 3 ++ .../ui/core_viewmodel/SharedViewModel.java | 6 +++ .../baselib/util/enums/EmvResultStatus.java | 3 +- .../baselib/viewModel/EmvBaseViewModel.java | 48 +++++++++++++++++-- 6 files changed, 75 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java index 759f8b3..5ae02ab 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/CardWaitingFragment.java @@ -154,6 +154,9 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind } else if(sharedViewModel.getIsCardAppBlock().getValue() != null && sharedViewModel.getIsCardAppBlock().getValue()) { cardReadViewModel.setCheckCardAlertMsg("Magstripe not allowed!",false); setupCardReadProcess(true); + } else if(sharedViewModel.getIsContactlessRestricted().getValue() != null && sharedViewModel.getIsContactlessRestricted().getValue()) { + cardReadViewModel.setCheckCardAlertMsg("Tap not allowed!",false); + setupCardReadProcess(true); } else { setupCardReadProcess(false); } @@ -166,6 +169,7 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind sharedViewModel.setIsFallback(false); sharedViewModel.setIsSeePhone(false); + sharedViewModel.setIsContactlessRestricted(false); // cardReadViewModel.cancelCheckCard(); @@ -262,7 +266,10 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind } else if(!SystemParamsOperation.getInstance().isNfcEnabled()) { allType.add(CardSlotTypeEnum.ICC1); allType.add(CardSlotTypeEnum.SWIPE); - } else { + } else if(sharedViewModel.getIsContactlessRestricted().getValue() != null && sharedViewModel.getIsContactlessRestricted().getValue()) { + allType.add(CardSlotTypeEnum.ICC1); +// allType.add(CardSlotTypeEnum.SWIPE); + } else { allType.add(CardSlotTypeEnum.ICC1); allType.add(CardSlotTypeEnum.RF); diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_ui/EmvTransactionFragment.java b/app/src/main/java/com/utsmm/kbz/ui/core_ui/EmvTransactionFragment.java index babb908..ecd9418 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_ui/EmvTransactionFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_ui/EmvTransactionFragment.java @@ -232,6 +232,17 @@ public class EmvTransactionFragment extends DataBindingFragment { case ON_NEXT_SCREEN: navigateToRRNScreen(); break; + case INSERT_OR_MANUAL: + if(cardReadViewModel.cardTypeData.getValue() != null && cardReadViewModel.cardTypeData.getValue() == CardTypeX.NFC.value) { + isCardTaped("Please insert or type card",new CardDetectCallback() { + @Override + public void onComplete() { + sharedViewModel.setIsContactlessRestricted(true); + navigateToCheckCard(); + } + }); + } + break; case READ_CARD_RETRY: LogUtil.d(TAG,"Card type :"+cardReadViewModel.cardTypeData.getValue()); if(cardReadViewModel.cardTypeData.getValue()!= null && cardReadViewModel.cardTypeData.getValue() == CardTypeX.IC.value) { diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java index 1f72414..8fe765d 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java @@ -172,6 +172,9 @@ public class EmvTransactionProcessViewModel extends EmvBaseViewModel implements case EMV_TRY_AGAIN: emvResultStatus.postValue(EmvResultStatus.READ_CARD_RETRY); break; + case EMV_INSERT_OR_MANUAL: + emvResultStatus.postValue(EmvResultStatus.INSERT_OR_MANUAL); + break; case EMV_CARD_APP_BLOCK: emvResultStatus.postValue(EmvResultStatus.CARD_APP_BLOCKED); break; diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java index 669fb1c..f6b74bc 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/SharedViewModel.java @@ -168,6 +168,8 @@ public class SharedViewModel extends ViewModel { private SingleLiveEvent isFallback = new SingleLiveEvent<>(); private SingleLiveEvent isSeePhone = new SingleLiveEvent<>(); + + private SingleLiveEvent isContactlessRestricted = new SingleLiveEvent<>(); private SingleLiveEvent isCardAppBlock = new SingleLiveEvent<>(); private SingleLiveEvent _isCardDataExist = new SingleLiveEvent<>(); @@ -246,6 +248,10 @@ public class SharedViewModel extends ViewModel { public SingleLiveEvent getIsSeePhone() { return isSeePhone;} + public void setIsContactlessRestricted(boolean status) { isContactlessRestricted.setValue(status);} + + public SingleLiveEvent getIsContactlessRestricted() {return isContactlessRestricted;} + public void setCardDataExist(boolean exist) { _isCardDataExist.setValue(exist);} public SingleLiveEvent getCardDataExist() { return _isCardDataExist; } diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/util/enums/EmvResultStatus.java b/baselib/src/main/java/com/utsmyanmar/baselib/util/enums/EmvResultStatus.java index fd9d20c..f6b5fea 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/util/enums/EmvResultStatus.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/util/enums/EmvResultStatus.java @@ -31,5 +31,6 @@ public enum EmvResultStatus { MPU_CARD, SEE_PHONE, OTHER_INTERFACE, - CARD_APP_BLOCKED + CARD_APP_BLOCKED, + INSERT_OR_MANUAL } 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 c9dde08..894f265 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -159,6 +159,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { protected static final int EMV_ERROR = 12; protected static final int EMV_TRY_AGAIN = 13; + protected static final int EMV_INSERT_OR_MANUAL = 24; protected static final int EMV_CARD_APP_BLOCK = 23; protected static final int EMV_CTLS_TRY_AGAIN = 13; @@ -179,6 +180,21 @@ public abstract class EmvBaseViewModel extends BaseViewModel { protected int mProcessStep; protected int mAppSelect = 0; + private static final String[] RESTRICTED_BINS = {"624430", + "624431", + "624445", + "626220", + "623476", + "629214", + "623466", + "623433", + "62911028", + "62441900", + "62441901" + }; + + private boolean isMPU_UPIContactless = false; + private boolean mMPUContactlessConfigured = false; private Looper mLooper = Looper.getMainLooper(); private final Handler mHandler = new Handler(mLooper) { @@ -215,7 +231,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { public void startProcess() { isOfflinePinEntered = false; mMPUContactlessConfigured = false; - + isMPU_UPIContactless = false; initData(); // Check if initialization was successful @@ -522,6 +538,16 @@ public abstract class EmvBaseViewModel extends BaseViewModel { ++pinEnterCount; } + private boolean isRestrictedBin(String cardNo) { + if (cardNo == null || cardNo.isEmpty()) return false; + for (String bin : RESTRICTED_BINS) { + if (cardNo.startsWith(bin)) { + LogUtil.d(TAG, "isRestrictedBin: matched BIN " + bin); + return true; + } + } + return false; + } private OnEmvProcessListener2 emvProcessListener = new OnEmvProcessListener2() { @Override @@ -590,7 +616,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { } else if (aidStr.contains("A000000003")) { configPaywaveParameters(); } else if (aidStr.contains("A000000333")) { - configureQuickPassParamerter(); +// configureQuickPassParamerter(); } else if (aidStr.contains("A000000541")) { configPureContactlessParameter(); } else if (aidStr.contains("A000000065")) { @@ -653,6 +679,17 @@ public abstract class EmvBaseViewModel extends BaseViewModel { cardNo = cardInfoEntity.getCardNo(); + + if (mPayDetail.getCardType() == CardTypeX.NFC.value) { + if (isRestrictedBin(cardNo)) { + isMPU_UPIContactless = true; + LogUtil.d(TAG, "onConfirmCardNo: restricted BIN detected — " + cardNo); + emvHandler.onSetConfirmCardNoResponse(false); + emvHandler.emvProcessCancel(); + } + } + + if (mPayDetail.getCardType() == CardTypeX.NFC.value) { cardNum.postValue(cardInfoEntity.getCardNo()); mPayDetail.setCardNo(cardInfoEntity.getCardNo()); @@ -824,7 +861,12 @@ public abstract class EmvBaseViewModel extends BaseViewModel { // case SdkResult.Emv_Cancel:// Transaction Cancel // //user cancel - mHandler.obtainMessage(EMV_ERROR, retCode, retCode, "Canceled").sendToTarget(); + if(isMPU_UPIContactless) { + mHandler.sendEmptyMessage(EMV_INSERT_OR_MANUAL); + } else { + mHandler.obtainMessage(EMV_ERROR, retCode, retCode, "Canceled").sendToTarget(); + } + break; // // case SdkResult.Emv_Offline_Declined: // From 75fb9697406ef3db97cec33c430dace0441a4024 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Sun, 17 May 2026 14:46:50 +0630 Subject: [PATCH 10/14] Merge branch 'duel_settlement' of https://hub.utsmyanmar.com/Kyaw_Min_Khant/KBZ-POS into duel_settlement From 8f218b5c99792e5ce0b18bc6510efa42ae13c3de Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Sun, 17 May 2026 21:40:58 +0630 Subject: [PATCH 11/14] restricted_bin_list --- .../java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java | 3 +++ .../com/utsmyanmar/baselib/util/TerminalUtil.java | 9 +++++++++ .../baselib/viewModel/EmvBaseViewModel.java | 6 ++---- .../utils/core_utils/SystemParamsOperation.java | 11 +++++++++++ .../utils/core_utils/SystemParamsSettings.java | 9 +++++++++ 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java index cad23ac..1716d6c 100644 --- a/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java +++ b/app/src/main/java/com/utsmm/kbz/util/tms/TMSSetupsImpl.java @@ -645,6 +645,9 @@ public class TMSSetupsImpl implements TMSSetups{ else if(TextUtils.equals(name,"bin_list")) { SystemParamsOperation.getInstance().setBinValue(data); } + else if (TextUtils.equals(name, "restricted_bin_list")) { + SystemParamsOperation.getInstance().setRestrictedBinValue(data); + } else if(TextUtils.equals(name, "printer_enabled")){ SystemParamsOperation.getInstance().setPrinterEnabled(parseBoolean(data)); }else if(TextUtils.equals(name, "is_duel_currency")){ diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/util/TerminalUtil.java b/baselib/src/main/java/com/utsmyanmar/baselib/util/TerminalUtil.java index c470290..e1b8e26 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/util/TerminalUtil.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/util/TerminalUtil.java @@ -75,4 +75,13 @@ public class TerminalUtil { else return binParser(SystemParamsOperation.getInstance().getBinValues()); } + + public List getRestrictedBinList() { + if (SystemParamsOperation.getInstance().getRestrictedBinValues() == null + || SystemParamsOperation.getInstance().getRestrictedBinValues().isEmpty()) { + return new ArrayList<>(); + } else { + return binParser(SystemParamsOperation.getInstance().getRestrictedBinValues()); + } + } } 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 894f265..e7a3e58 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -179,7 +179,6 @@ public abstract class EmvBaseViewModel extends BaseViewModel { protected boolean isSecondCall = false; protected int mProcessStep; protected int mAppSelect = 0; - private static final String[] RESTRICTED_BINS = {"624430", "624431", "624445", @@ -192,9 +191,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { "62441900", "62441901" }; - private boolean isMPU_UPIContactless = false; - private boolean mMPUContactlessConfigured = false; private Looper mLooper = Looper.getMainLooper(); private final Handler mHandler = new Handler(mLooper) { @@ -540,7 +537,8 @@ public abstract class EmvBaseViewModel extends BaseViewModel { private boolean isRestrictedBin(String cardNo) { if (cardNo == null || cardNo.isEmpty()) return false; - for (String bin : RESTRICTED_BINS) { + List restrictedBins = TerminalUtil.getInstance().getRestrictedBinList(); + for (String bin : restrictedBins) { if (cardNo.startsWith(bin)) { LogUtil.d(TAG, "isRestrictedBin: matched BIN " + bin); return true; 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 8878da7..020a4dc 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 @@ -1536,6 +1536,17 @@ public class SystemParamsOperation { return params.getBinValues(); } + public void setRestrictedBinValue(String value) { + SystemParamsSettings params = getSystemParamsSettings(); + params.setRestrictedBinValues(value); + saveSystemParamsSettings(params); + } + + public String getRestrictedBinValues() { + SystemParamsSettings params = getSystemParamsSettings(); + return params.getRestrictedBinValues(); + } + public String getSecHostMerchantId() { SystemParamsSettings params = getSystemParamsSettings(); return params.getSecHostMerchantId(); 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 ea29373..c845781 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 @@ -44,6 +44,7 @@ public class SystemParamsSettings implements Serializable { private String ereceiptAddress = "https://api-tms.kbzbank.com/receipt"; private String binValues = ""; + private String restrictedBinValues = ""; private String terminalName = ""; @@ -363,6 +364,14 @@ public class SystemParamsSettings implements Serializable { return this.binValues; } + protected void setRestrictedBinValues(String restrictedBinValues) { + this.restrictedBinValues = restrictedBinValues; + } + + protected String getRestrictedBinValues() { + return this.restrictedBinValues; + } + protected void setDisabledMessage(String disabledMessage) { this.disabledMessage = disabledMessage; } From 5e40b948de76965b21b47401d7e4bc10060a76c5 Mon Sep 17 00:00:00 2001 From: kizzy Date: Tue, 19 May 2026 12:25:49 +0700 Subject: [PATCH 12/14] removed AID for JCB cards and Pre Auth Flow is fixed --- .../com/utsmm/kbz/ui/core_ui/InputRRNFragment.java | 2 ++ .../core_viewmodel/EmvTransactionProcessViewModel.java | 4 ++-- .../utsmm/kbz/ui/manual_entry/ManualEntryFragment.java | 4 ++-- .../com/utsmyanmar/baselib/db/dao/PayDetailDao.java | 2 +- .../com/utsmyanmar/baselib/emv/EmvParamOperation.java | 2 +- .../utsmyanmar/baselib/viewModel/EmvBaseViewModel.java | 7 ++++--- baselib/src/main/res/raw/contacts_config.json | 6 +++--- baselib/src/main/res/raw/rid_config.json | 10 ++++++++++ 8 files changed, 25 insertions(+), 12 deletions(-) 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 909c19a..345a506 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 @@ -245,6 +245,8 @@ public class InputRRNFragment extends DataBindingFragment { } else { + LogUtil.d(TAG,"PreAuth Cancel RRN not found!"); + terminateProcess(isECR); } diff --git a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java index 8fe765d..ebf42f2 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/core_viewmodel/EmvTransactionProcessViewModel.java @@ -457,8 +457,8 @@ public class EmvTransactionProcessViewModel extends EmvBaseViewModel implements @Override public void processPreVoidDb(PayDetail payResult) { - mPayDetail.setIsCanceled(true); - updatePayDetail(mPayDetail); + oldTransPayDetail.setIsCanceled(true); + updatePayDetail(oldTransPayDetail); repository.insertPayDetail(updateCurrentDateAndTime(payResult)); } diff --git a/app/src/main/java/com/utsmm/kbz/ui/manual_entry/ManualEntryFragment.java b/app/src/main/java/com/utsmm/kbz/ui/manual_entry/ManualEntryFragment.java index b18eab2..eddcbd2 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/manual_entry/ManualEntryFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/manual_entry/ManualEntryFragment.java @@ -77,7 +77,7 @@ public class ManualEntryFragment extends DataBindingFragment { } private void processEmvCard() { - if(sharedViewModel.transactionsType.getValue() == TransactionsType.REFUND || sharedViewModel.transactionsType.getValue() == TransactionsType.PRE_AUTH_VOID) { + if(sharedViewModel.transactionsType.getValue() == TransactionsType.REFUND || sharedViewModel.transactionsType.getValue() == TransactionsType.PRE_AUTH_VOID || sharedViewModel.transactionsType.getValue() == TransactionsType.PRE_AUTH_COMPLETE) { routeId = R.id.action_manualEntryFragment_to_inputRRNFragment; } else { routeId = R.id.action_manualEntryFragment_to_emvTransactionFragment; @@ -106,7 +106,7 @@ public class ManualEntryFragment extends DataBindingFragment { payDetail.setICC55(""); // payDetail.setAuthNo(manualEntryViewModel.cvv.getValue()); - + emvTransactionProcessViewModel.cardNum.setValue(cardNo); emvTransactionProcessViewModel.setTradeData(tradeData); safeNavigateToRouteId(); diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/db/dao/PayDetailDao.java b/baselib/src/main/java/com/utsmyanmar/baselib/db/dao/PayDetailDao.java index 60d6882..fcd0116 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/db/dao/PayDetailDao.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/db/dao/PayDetailDao.java @@ -143,7 +143,7 @@ public interface PayDetailDao { @Query(("SELECT * FROM paydetail WHERE isCanceled = 0 AND CardNo IN(:cardNo) AND referNo IN(:referNo)")) LiveData searchPayDetail(String cardNo,String referNo); - @Query(("SELECT * FROM paydetail WHERE isCanceled = 0 and isAdjust = 0 AND CardNo IN(:cardNo) AND referNo IN(:referNo)")) + @Query(("SELECT * FROM paydetail WHERE isCanceled = 0 AND isAdjust = 0 AND CardNo IN(:cardNo) AND referNo IN(:referNo)")) LiveData searchPayDetailPreCancel(String cardNo,String referNo); diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/emv/EmvParamOperation.java b/baselib/src/main/java/com/utsmyanmar/baselib/emv/EmvParamOperation.java index 6bd8a1b..f848932 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/emv/EmvParamOperation.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/emv/EmvParamOperation.java @@ -116,7 +116,7 @@ public class EmvParamOperation extends ParamOperation{ processPayWave(); processPayPass(); processQuickPass(); - processJSpeedy(); +// processJSpeedy(); processMPUCtls(); processChips(); processRids(); 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 e7a3e58..f9eaf0f 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -179,7 +179,8 @@ public abstract class EmvBaseViewModel extends BaseViewModel { protected boolean isSecondCall = false; protected int mProcessStep; protected int mAppSelect = 0; - private static final String[] RESTRICTED_BINS = {"624430", + private static final String[] RESTRICTED_BINS = { + "624430", "624431", "624445", "626220", @@ -291,7 +292,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { setTransactionLimitForMPUCtls(false); -// emvHandler.contactlessConfigKernelId(EmvCardBrandEnum.EMV_CARD_BRAND_JCB,(byte) 0x01,ByteUtils.hexString2ByteArray("06")); + emvHandler.contactlessConfigKernelId(EmvCardBrandEnum.EMV_CARD_BRAND_JCB,(byte) 0x01,ByteUtils.hexString2ByteArray("06")); emvHandler.contactlessAppendAidIntoKernel(EmvCardBrandEnum.EMV_CARD_BRAND_MASTER, (byte) 0x07, ByteUtils.hexString2ByteArray("A0000008890101")); // emvHandler.contactlessAppendAidIntoKernelFirst(true); LogUtil.d(TAG, "TransData :" + transData.getTransAmount()); @@ -1238,7 +1239,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel { emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x1B}, new byte[]{(byte) 0x30}); //EMV MODE :amount >contactless cvm limit, set 60 = online pin and signature , set 20 = signature - emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x18}, new byte[]{(byte) 0xF0}); //F8 + emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x18}, new byte[]{(byte) 0xF0}); //F8 //F0 //EMV mode :amount < contactless cvm limit, set 08 = no cvm emvHandler.setTlv(new byte[]{(byte) 0xDF, (byte) 0x81, (byte) 0x19}, new byte[]{(byte) 0x08}); //08 diff --git a/baselib/src/main/res/raw/contacts_config.json b/baselib/src/main/res/raw/contacts_config.json index 0723d52..4d3736c 100644 --- a/baselib/src/main/res/raw/contacts_config.json +++ b/baselib/src/main/res/raw/contacts_config.json @@ -530,7 +530,7 @@ "currencyCode": "0104" }, { - "aidEnable": true, + "aidEnable": false, "aid": "A00000006510", "cardScheme": "JCB", "applicationVersion": "0030", @@ -553,7 +553,7 @@ "currencyCode": "0104" }, { - "aidEnable": true, + "aidEnable": false, "aid": "A0000000651010", "cardScheme": "JCB", "applicationVersion": "0030", @@ -576,7 +576,7 @@ "currencyCode": "0104" }, { - "aidEnable": true, + "aidEnable": false, "aid": "A0000001570040", "cardScheme": "JCB", "applicationVersion": "0030", diff --git a/baselib/src/main/res/raw/rid_config.json b/baselib/src/main/res/raw/rid_config.json index c99a4d7..4f639b0 100644 --- a/baselib/src/main/res/raw/rid_config.json +++ b/baselib/src/main/res/raw/rid_config.json @@ -309,5 +309,15 @@ "exponent": "03", "expDate": "20201231", "checkSum": "43A3151513B7ADCEB92DBEA2A262CEB336D26C83" + }, + { + "rid": "A000000065", + "indx": "13", + "hashInd": "01", + "arithInd": "00", + "modul": "A3270868367E6E29349FC2743EE545AC53BD3029782488997650108524FD051E3B6EACA6A9A6C1441D28889A5F46413C8F62F3645AAEB30A1521EEF41FD4F3445BFA1AB29F9AC1A74D9A16B93293296CB09162B149BAC22F88AD8F322D684D6B49A12413FC1B6AC70EDEDB18EC1585519A89B50B3D03E14063C2CA58B7C2BA7FB22799A33BCDE6AFCBEB4A7D64911D08D18C47F9BD14A9FAD8805A15DE5A38945A97919B7AB88EFA11A88C0CD92C6EE7DC352AB0746ABF13585913C8A4E04464B77909C6BD94341A8976C4769EA6C0D30A60F4EE8FA19E767B170DF4FA80312DBA61DB645D5D1560873E2674E1F620083F30180BD96CA589", + "exponent": "03", + "expDate": "20201231", + "checkSum": "54CFAE617150DFA09D3F901C9123524523EBEDF3" } ] \ No newline at end of file From b8f85b3693c5a4749b74525668c3137ebecaa427 Mon Sep 17 00:00:00 2001 From: kizzy Date: Tue, 19 May 2026 13:46:48 +0700 Subject: [PATCH 13/14] If MPU contactless amount is above 1Lakh, now showing as MPU-UPI contactless Insert or type card --- .../com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 f9eaf0f..cc8cf7c 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/viewModel/EmvBaseViewModel.java @@ -847,7 +847,12 @@ public abstract class EmvBaseViewModel extends BaseViewModel { case SdkResult.Emv_Candidatelist_Empty:// Application have no aid list case SdkResult.Emv_FallBack:// FallBack ,chip card reset failed //fallback process - mHandler.sendEmptyMessage(EMV_TRY_AGAIN); + if(mMPUContactlessConfigured) { + mHandler.sendEmptyMessage(EMV_INSERT_OR_MANUAL); + } else { + mHandler.sendEmptyMessage(EMV_TRY_AGAIN); + } + break; case SdkResult.Emv_Declined: From 31705e6a9ffbcb5605fbb0dbd7e98c1743651843 Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Mon, 25 May 2026 14:20:39 +0630 Subject: [PATCH 14/14] Merge branch 'production_2.2' into test --- .../main/java/com/utsmm/kbz/MainActivity.java | 6 +- .../ui/settlement/SettlementViewModel.java | 4 ++ .../layout/fragment_capture_card_screen.xml | 1 + .../res/layout/fragment_view_batch_screen.xml | 57 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + .../paylibs/print/printx/BaseXPrint.java | 30 ++++++---- .../paylibs/print/printx/PrintXImpl.java | 3 +- .../core_utils/SystemParamsSettings.java | 6 +- 8 files changed, 92 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/utsmm/kbz/MainActivity.java b/app/src/main/java/com/utsmm/kbz/MainActivity.java index ea2f59d..e4535b9 100644 --- a/app/src/main/java/com/utsmm/kbz/MainActivity.java +++ b/app/src/main/java/com/utsmm/kbz/MainActivity.java @@ -160,8 +160,10 @@ public class MainActivity extends AppCompatActivity implements } private void initKey(){ - SystemParamsOperation.getInstance().setTmsAddress("https://api-tms.kbzbank.com/sirius"); - SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms.kbzbank.com/receipt"); +// SystemParamsOperation.getInstance().setTmsAddress("https://api-tms.kbzbank.com/sirius"); +// SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms.kbzbank.com/receipt"); + SystemParamsOperation.getInstance().setTmsAddress("https://api-tms-uat.kbzbank.com:8443/sirius"); + SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms-uat.kbzbank.com:8443/receipt"); PinPad pinPad = MyApplication.getInstance().deviceEngine.getPinPad(); byte[] encryptedPIK = SystemParamsOperation.getInstance().getPIK(); diff --git a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java index 951443f..8a3afbb 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settlement/SettlementViewModel.java @@ -77,6 +77,10 @@ public class SettlementViewModel extends ViewModel { public SingleLiveEvent sale_count = new SingleLiveEvent<>(); public SingleLiveEvent sale_amount = new SingleLiveEvent<>(); public SingleLiveEvent sale_breakdown = new SingleLiveEvent<>(); + + public SingleLiveEvent void_count = new SingleLiveEvent<>(); + public SingleLiveEvent void_amount = new SingleLiveEvent<>(); + public SingleLiveEvent void_breakdown = new SingleLiveEvent<>(); public SingleLiveEvent pre_count = new SingleLiveEvent<>(); public SingleLiveEvent pre_amount = new SingleLiveEvent<>(); diff --git a/app/src/main/res/layout/fragment_capture_card_screen.xml b/app/src/main/res/layout/fragment_capture_card_screen.xml index 3445f63..6b25b95 100644 --- a/app/src/main/res/layout/fragment_capture_card_screen.xml +++ b/app/src/main/res/layout/fragment_capture_card_screen.xml @@ -144,6 +144,7 @@ + + + + + + + + + + + + + + + Count Totals Sale + Void Sale Completion Refund Amount 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 e3e43f4..cfa4828 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 @@ -290,9 +290,9 @@ public abstract class BaseXPrint { } private void printSettlementCurrencySection(String currencyLabel, CurrencySettlementSummary summary) { - if (!summary.hasAnyValue()) { - return; - } +// if (!summary.hasAnyValue()) { +// return; +// } boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable(); int totalCount = summary.saleCount + summary.preAuthCompCount + summary.refundCount + summary.cashAdvanceCount; @@ -390,6 +390,13 @@ public abstract class BaseXPrint { } + protected void printTransFooterForSettlement() { + String receiptFooter = SystemParamsOperation.getInstance().getReceiptFooter(); + String finalVersion = SystemParamsOperation.getInstance().getFinalVersion(); + printer.appendPrnStr("***** SETTLEMENT CONFIRM *****", fontNormal, AlignEnum.CENTER,false); + printer.appendPrnStr(receiptFooter, fontNormal, AlignEnum.CENTER,false); + } + protected void printTransDetail(PayDetail payDetail) { @@ -1600,10 +1607,10 @@ public abstract class BaseXPrint { }else{ if(isSettlement && isDuelCurrency){ - printer.appendPrnStr("MID :" + safe(SystemParamsOperation.getInstance().getMerchantId()), fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("TID :" + safe(SystemParamsOperation.getInstance().getTerminalId()), fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("MID :" + safe(SystemParamsOperation.getInstance().getThirdHostMerchantId()), fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("TID :" + safe(SystemParamsOperation.getInstance().getThirdHostTerminalId()), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("MID :" + SystemParamsOperation.getInstance().getMerchantId(), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("TID :" + SystemParamsOperation.getInstance().getTerminalId(), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("MID :" + SystemParamsOperation.getInstance().getThirdHostMerchantId(), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("TID :" + SystemParamsOperation.getInstance().getThirdHostTerminalId(), fontNormal, AlignEnum.LEFT, false); }else{ printer.appendPrnStr("MID :" + payDetail.getMerchantNo(), fontNormal, AlignEnum.LEFT,false); printer.appendPrnStr("TID :" + payDetail.getTerminalNo(), fontNormal, AlignEnum.LEFT,false); @@ -1739,16 +1746,17 @@ public abstract class BaseXPrint { // ---------- PRIMARY HOST ---------- printer.appendPrnStr("PRIMARY HOST", fontNormal, AlignEnum.LEFT, true); - printer.appendPrnStr("Name : " + safe(sp.getHostName()), fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("TID : " + safe(sp.getTerminalId()), fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("MID : " + safe(sp.getMerchantId()), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("Name : " + sp.getHostName(), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("TID : " + sp.getTerminalId(), fontNormal, AlignEnum.LEFT, false); + printer.appendPrnStr("MID : " + sp.getMerchantId(), fontNormal, AlignEnum.LEFT, false); String[] ipPort = splitIpAndPort(sp.getIpAddress()); printer.appendPrnStr("Primary IP : " + ipPort[0], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Primary Port : " + ipPort[1], fontNormal, AlignEnum.LEFT, false); String[] secIpPort = splitIpAndPort(sp.getSecIpAddress()); printer.appendPrnStr("Secondary IP : " + secIpPort[0], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Secondary Port: " + secIpPort[1], fontNormal, AlignEnum.LEFT, false); - printer.appendPrnStr("Currency : " + normalizeHostCurrency(sp.getCurrencyType() == null ? "" : sp.getCurrencyType().toString()), fontNormal, AlignEnum.LEFT, false); + sp.getCurrencyType(); + printer.appendPrnStr(sp.getCurrencyType().toString(), fontNormal, AlignEnum.LEFT, false); dotBreak(); // ---------- SECONDARY HOST (optional) ---------- if (!TextUtils.isEmpty(sp.getSecHostName())) { diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java index 4acbb91..3f0a970 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java @@ -193,7 +193,8 @@ public class PrintXImpl extends BaseXPrint implements PrintX { printMerchantHeader(); printTransHeader(payDetail); printTransDetailSettlement(payDetail); - printTransFooterSummary(); +// printTransFooterSummary(); + printTransFooterForSettlement(); emptyLine(1); startPrintNex(); 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 c845781..59c75d8 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 @@ -40,8 +40,10 @@ public class SystemParamsSettings implements Serializable { private boolean checkExpSwitch = false; - private String tmsAddress = "https://api-tms.kbzbank.com/sirius"; - private String ereceiptAddress = "https://api-tms.kbzbank.com/receipt"; +// private String tmsAddress = "https://api-tms.kbzbank.com/sirius"; +// private String ereceiptAddress = "https://api-tms.kbzbank.com/receipt"; + private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius"; + private String ereceiptAddress = "https://api-tms-uat.kbzbank.com:8443/receipt"; private String binValues = ""; private String restrictedBinValues = "";