From f63f10e834495959eef6fcaddbc6a7c7f05f452c Mon Sep 17 00:00:00 2001 From: moon <56061215+MgKyawLay@users.noreply.github.com> Date: Tue, 31 Mar 2026 00:12:05 +0630 Subject: [PATCH] fix injection --- .../main/java/com/utsmm/kbz/MainFragment.java | 226 +--------------- .../ui/dashboard/DashboardTransFragment.java | 211 +-------------- .../kbz/ui/settings/InjectKeyFragment.java | 81 +----- .../kbz/util/CurrencySelectionHelper.java | 245 ++++++++++++++++++ .../main/res/layout/fragment_inject_key.xml | 139 +--------- 5 files changed, 260 insertions(+), 642 deletions(-) create mode 100644 app/src/main/java/com/utsmm/kbz/util/CurrencySelectionHelper.java diff --git a/app/src/main/java/com/utsmm/kbz/MainFragment.java b/app/src/main/java/com/utsmm/kbz/MainFragment.java index ccfa50b..8fe1679 100644 --- a/app/src/main/java/com/utsmm/kbz/MainFragment.java +++ b/app/src/main/java/com/utsmm/kbz/MainFragment.java @@ -4,25 +4,18 @@ 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; @@ -65,6 +58,7 @@ import com.utsmm.kbz.ui.core_viewmodel.TMSProcessViewModel; import com.utsmm.kbz.util.Connectivity; +import com.utsmm.kbz.util.CurrencySelectionHelper; import com.utsmm.kbz.util.dialog.AlertXDialog; import com.utsmm.kbz.util.enums.SettlementType; import com.utsmm.kbz.util.ecr.CoreUtils; @@ -77,7 +71,6 @@ 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; @@ -107,13 +100,7 @@ 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; + private CurrencySelectionHelper currencySelectionHelper; @Inject EmvParamOperation emvParamOperation; @@ -138,6 +125,7 @@ public class MainFragment extends DataBindingFragment { sharedViewModel = getFragmentScopeViewModel(SharedViewModel.class); mainViewModel = getFragmentScopeViewModel(MainViewModel.class); tmsProcessViewModel = getFragmentScopeViewModel(TMSProcessViewModel.class); + currencySelectionHelper = new CurrencySelectionHelper(this, sharedViewModel); // Initialize ModernECRManager // ModernECRFactory factory = new ModernECRFactory(requireContext(), sharedViewModel); @@ -446,43 +434,11 @@ public class MainFragment extends DataBindingFragment { } 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(); - }); + currencySelectionHelper.showCardCurrencyChooser(this::startCardSaleFlow); } private void showCurrencyChooserForSignOn() { - List currencies = getAvailableCardSaleCurrencies(); - if (currencies.isEmpty()) { - applyCardCurrencyAndHost("MMK"); - navigateToSignOn(); - return; - } - - if (currencies.size() == 1) { - applyCardCurrencyAndHost(currencies.get(0)); - navigateToSignOn(); - return; - } - - showCurrencyPickerDialog("Choose Currency", currencies, currency -> { - applyCardCurrencyAndHost(currency); - navigateToSignOn(); - }); + currencySelectionHelper.showCardCurrencyChooser(this::navigateToSignOn); } private void navigateToSignOn() { @@ -490,178 +446,6 @@ public class MainFragment extends DataBindingFragment { safeNavigateToRouteId(); } - private List getAvailableCardSaleCurrencies() { - cachePrimaryCardHostIfNeeded(); - LinkedHashSet values = new LinkedHashSet<>(); - - if (cardPrimaryCurrency != null && !TextUtils.isEmpty(cardPrimaryCurrency.name)) { - values.add(normalizeCurrency(cardPrimaryCurrency.name)); - } - - if (!SystemParamsOperation.getInstance().getDuelCurrencyStatus()) { - return new ArrayList<>(values); - } - - 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 dualCurrencyEnabled = SystemParamsOperation.getInstance().getDuelCurrencyStatus(); - - boolean useSecondaryCardHost = dualCurrencyEnabled - && !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(); 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 9758c02..8ca8c39 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,25 +2,16 @@ 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; @@ -30,28 +21,21 @@ import com.utsmm.kbz.config.Constants; import com.utsmm.kbz.config.data.model.Features; import com.utsmm.kbz.ui.adapters.MainAdapter; import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel; +import com.utsmm.kbz.util.CurrencySelectionHelper; import com.utsmm.kbz.util.tms.TMSUtil; import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; public class DashboardTransFragment extends DataBindingFragment { private MainViewModel mainViewModel; private SharedViewModel sharedViewModel; + private CurrencySelectionHelper currencySelectionHelper; 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; @@ -76,6 +60,7 @@ public class DashboardTransFragment extends DataBindingFragment { protected void initViewModel() { mainViewModel = getFragmentScopeViewModel(MainViewModel.class); sharedViewModel = getFragmentScopeViewModel(SharedViewModel.class); + currencySelectionHelper = new CurrencySelectionHelper(this, sharedViewModel); } @Override @@ -288,195 +273,7 @@ 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)); - } - - if (!SystemParamsOperation.getInstance().getDuelCurrencyStatus()) { - return new ArrayList<>(values); - } - - 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 dualCurrencyEnabled = SystemParamsOperation.getInstance().getDuelCurrencyStatus(); - - boolean useSecondaryCardHost = dualCurrencyEnabled - && !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); + currencySelectionHelper.showCardCurrencyChooser(onSelected); } } diff --git a/app/src/main/java/com/utsmm/kbz/ui/settings/InjectKeyFragment.java b/app/src/main/java/com/utsmm/kbz/ui/settings/InjectKeyFragment.java index e003b2c..3d42d79 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/settings/InjectKeyFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/settings/InjectKeyFragment.java @@ -3,7 +3,6 @@ package com.utsmm.kbz.ui.settings; import android.os.Bundle; import android.text.TextUtils; import android.view.View; -import android.widget.ArrayAdapter; import android.widget.Toast; import androidx.annotation.NonNull; @@ -16,16 +15,12 @@ import com.nexgo.downloadkey.downloadflow.DownloadFlowResultEntity; import com.nexgo.downloadkey.downloadflow.DownloadResult; import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.util.DataBindingConfig; -import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; import com.utsmm.kbz.BR; import com.utsmm.kbz.R; import com.utsmm.kbz.databinding.FragmentInjectKeyBinding; import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmm.kbz.util.tms.TMSUtil; -import java.util.ArrayList; -import java.util.List; - public class InjectKeyFragment extends DataBindingFragment { private static final String TAG = InjectKeyFragment.class.getSimpleName(); @@ -36,8 +31,6 @@ public class InjectKeyFragment extends DataBindingFragment { // Key injection variables private DownloadFlow mDownloadFlow; private int keyIndexTmp = 8; // Default key index - private final List hostSelectionItems = new ArrayList<>(); - private HostSelectionItem selectedHostSelectionItem; @Override protected void initViewModel() { @@ -90,50 +83,9 @@ public class InjectKeyFragment extends DataBindingFragment { } private void updateConfigurationInfo() { - setupHostSelection(); binding.serialNumberValue.setText(getDisplayValue(TMSUtil.getInstance().getSerialNumber())); } - private void setupHostSelection() { - hostSelectionItems.clear(); - - String primaryTerminalId = SystemParamsOperation.getInstance().getTerminalId(); - String primaryMerchantId = SystemParamsOperation.getInstance().getMerchantId(); - String secondaryTerminalId = SystemParamsOperation.getInstance().getThirdHostTerminalId(); - String secondaryMerchantId = SystemParamsOperation.getInstance().getThirdHostMerchantId(); - - hostSelectionItems.add(new HostSelectionItem("Primary Host", primaryTerminalId, primaryMerchantId)); - - if (!TextUtils.isEmpty(secondaryTerminalId) || !TextUtils.isEmpty(secondaryMerchantId)) { - hostSelectionItems.add(new HostSelectionItem("Secondary Host", secondaryTerminalId, secondaryMerchantId)); - } - - ArrayAdapter hostAdapter = new ArrayAdapter<>( - requireContext(), - android.R.layout.simple_list_item_1, - hostSelectionItems - ); - binding.actvHostSelection.setAdapter(hostAdapter); - - if (!hostSelectionItems.isEmpty()) { - HostSelectionItem defaultSelection = hostSelectionItems.get(0); - binding.actvHostSelection.setText(defaultSelection.toString(), false); - applyHostSelection(defaultSelection); - } - - binding.actvHostSelection.setOnItemClickListener((parent, view, position, id) -> { - if (position >= 0 && position < hostSelectionItems.size()) { - applyHostSelection(hostSelectionItems.get(position)); - } - }); - } - - private void applyHostSelection(@NonNull HostSelectionItem selectionItem) { - selectedHostSelectionItem = selectionItem; - binding.terminalIdValue.setText(getDisplayValue(selectionItem.terminalId)); - binding.merchantIdValue.setText(getDisplayValue(selectionItem.merchantId)); - } - private String getDisplayValue(String value) { return !TextUtils.isEmpty(value) ? value : "Not configured"; } @@ -158,21 +110,18 @@ public class InjectKeyFragment extends DataBindingFragment { mDownloadFlow = DownloadFlow.getInstance(); - String terminalId = selectedHostSelectionItem != null ? selectedHostSelectionItem.terminalId : null; - String merchantId = selectedHostSelectionItem != null ? selectedHostSelectionItem.merchantId : null; String serialNo = TMSUtil.getInstance().getSerialNumber(); - // Validate configuration - if (TextUtils.isEmpty(terminalId) || TextUtils.isEmpty(merchantId) || TextUtils.isEmpty(serialNo)) { + if (TextUtils.isEmpty(serialNo)) { dismissLoadingDialog(); - showDeclineDialog("Please configure the selected Terminal ID and Merchant ID first in TMS Configuration"); + showDeclineDialog("Serial number is not configured"); return; } final DownloadFEntity downloadFEntity = new DownloadFEntity(); downloadFEntity.setSn(serialNo.getBytes()); - downloadFEntity.setMid(merchantId.getBytes()); - downloadFEntity.setTid(terminalId.getBytes()); + downloadFEntity.setMid(null); + downloadFEntity.setTid(null); downloadFEntity.setTmkIndex(keyIndexTmp); downloadFEntity.setPort(0); downloadFEntity.setTimeOut(10); @@ -213,28 +162,6 @@ public class InjectKeyFragment extends DataBindingFragment { } }; - private static class HostSelectionItem { - private final String label; - private final String terminalId; - private final String merchantId; - - private HostSelectionItem(String label, String terminalId, String merchantId) { - this.label = label; - this.terminalId = terminalId; - this.merchantId = merchantId; - } - - @NonNull - @Override - public String toString() { - return label; - } - - private static String getSummaryValue(String value) { - return TextUtils.isEmpty(value) ? "Not configured" : value; - } - } - // ClickEvent class for data binding - this is the proper pattern public class ClickEvent { diff --git a/app/src/main/java/com/utsmm/kbz/util/CurrencySelectionHelper.java b/app/src/main/java/com/utsmm/kbz/util/CurrencySelectionHelper.java new file mode 100644 index 0000000..b8dd67f --- /dev/null +++ b/app/src/main/java/com/utsmm/kbz/util/CurrencySelectionHelper.java @@ -0,0 +1,245 @@ +package com.utsmm.kbz.util; + +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.Gravity; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.AppCompatButton; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; + +import com.utsmm.kbz.R; +import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel; +import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; +import com.utsmyanmar.paylibs.utils.enums.CurrencyType; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; + +public class CurrencySelectionHelper { + + private final Fragment fragment; + private final SharedViewModel sharedViewModel; + private boolean primaryHostCached = false; + private String primaryHostName = ""; + private String primaryTid = ""; + private String primaryMid = ""; + private String primaryIp = ""; + private String primarySecIp = ""; + private CurrencyType primaryCurrency = CurrencyType.MMK; + + public CurrencySelectionHelper(Fragment fragment, SharedViewModel sharedViewModel) { + this.fragment = fragment; + this.sharedViewModel = sharedViewModel; + } + + public void showCardCurrencyChooser(Runnable onSelected) { + showCardCurrencyChooser(onSelected, null); + } + + public void showCardCurrencyChooser(Runnable onSelected, Runnable onCancelled) { + List currencies = getAvailableCardCurrencies(); + 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(); + }, onCancelled); + } + + private List getAvailableCardCurrencies() { + cachePrimaryCardHostIfNeeded(); + LinkedHashSet values = new LinkedHashSet<>(); + + if (primaryCurrency != null && !TextUtils.isEmpty(primaryCurrency.name)) { + values.add(normalizeCurrency(primaryCurrency.name)); + } + + if (!SystemParamsOperation.getInstance().getDuelCurrencyStatus()) { + return new ArrayList<>(values); + } + + 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 dualCurrencyEnabled = SystemParamsOperation.getInstance().getDuelCurrencyStatus(); + + boolean useSecondaryCardHost = dualCurrencyEnabled + && !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(primaryHostName); + SystemParamsOperation.getInstance().setTerminalId(primaryTid); + SystemParamsOperation.getInstance().setMerchantId(primaryMid); + SystemParamsOperation.getInstance().setIpAddress(primaryIp); + SystemParamsOperation.getInstance().setSecIpAddress(primarySecIp); + } + + CurrencyType currencyType = useSecondaryCardHost ? toCurrencyType(selected) : primaryCurrency; + SystemParamsOperation.getInstance().setCurrencyType(currencyType); + if (sharedViewModel != null) { + sharedViewModel.set_currencyText(currencyType.name); + } + } + + private void cachePrimaryCardHostIfNeeded() { + if (primaryHostCached) { + return; + } + + primaryHostName = SystemParamsOperation.getInstance().getHostName(); + primaryTid = SystemParamsOperation.getInstance().getTerminalId(); + primaryMid = SystemParamsOperation.getInstance().getMerchantId(); + primaryIp = SystemParamsOperation.getInstance().getIpAddress(); + primarySecIp = SystemParamsOperation.getInstance().getSecIpAddress(); + CurrencyType activeCurrency = SystemParamsOperation.getInstance().getCurrencyType(); + primaryCurrency = activeCurrency == null ? CurrencyType.MMK : activeCurrency; + primaryHostCached = 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, + Runnable onCancelled + ) { + LinearLayout root = new LinearLayout(fragment.requireContext()); + root.setOrientation(LinearLayout.VERTICAL); + root.setPadding(dp(20), dp(20), dp(20), dp(12)); + + TextView tvTitle = new TextView(fragment.requireContext()); + tvTitle.setText(title); + tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + tvTitle.setTextColor(ContextCompat.getColor(fragment.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(fragment.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(fragment.requireContext(), R.color.white)); + button.setOnClickListener(v -> { + if (dialogHolder[0] != null) { + dialogHolder[0].dismiss(); + } + callback.onSelected(currency); + }); + root.addView(button); + } + + AppCompatButton cancel = new AppCompatButton(fragment.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(fragment.requireContext(), R.color.colorPrimary)); + cancel.setOnClickListener(v -> { + if (dialogHolder[0] != null) { + dialogHolder[0].dismiss(); + } + if (onCancelled != null) { + onCancelled.run(); + } + }); + root.addView(cancel); + + AlertDialog dialog = new AlertDialog.Builder(fragment.requireContext()) + .setView(root) + .create(); + dialogHolder[0] = dialog; + dialog.show(); + } + + private int dp(int value) { + return Math.round(value * fragment.requireContext().getResources().getDisplayMetrics().density); + } + + private interface CurrencySelectCallback { + void onSelected(String currency); + } +} diff --git a/app/src/main/res/layout/fragment_inject_key.xml b/app/src/main/res/layout/fragment_inject_key.xml index 7aee3d6..9f46697 100644 --- a/app/src/main/res/layout/fragment_inject_key.xml +++ b/app/src/main/res/layout/fragment_inject_key.xml @@ -100,6 +100,7 @@ android:textColor="@color/colorTextContent" android:textSize="14sp" tools:fontFamily="sans-serif" /> + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -