Fixed Bin List issues

This commit is contained in:
kizzy 2026-01-21 19:33:57 +07:00
parent 8e93e61eb5
commit 67fc55800a
19 changed files with 391 additions and 55 deletions

View File

@ -4,7 +4,18 @@
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2026-01-08T07:42:32.649681Z">
<DropdownSelection timestamp="2026-01-20T10:19:44.274945Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=0123456789ABCDEF" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="testResponseSalePacket()">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2026-01-20T10:15:53.662415Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="PhysicalDevice" identifier="serial=0123456789ABCDEF" />

View File

@ -54,7 +54,7 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
debuggable false
debuggable true
}
}
compileOptions {

View File

@ -112,6 +112,7 @@ public class ExampleInstrumentedTest {
String resp = "0071600000051730323130723000000A80820031363437363137333130303030303030323730303030303030303030303030353530303030313039313634353532303030303033323630313039313731353532303031303030303735343431393130303030343733343531303400048A023936";
resp = "00DB600000051730323130723000000A80820031363335373130353030333938393032373030303030303030303030303030353030303030313230313633323039303030303133323630313230313633323033303031303030303832333632393130383132333037313431303401105F2A02010482021C008407A00000006510109505808800E0009A032601209C01009F02060000000500009F03060000000000009F100807010104A09000B09F1A0201049F26080611D1D33562865F9F2701809F3303E0E8C89F34031E03009F360200049F37045A647F128A023936";
byte[] response = ByteUtil.hexStr2Bytes(resp);
String bitmap = BitmapConfig.BPC_SALE;

View File

@ -8,11 +8,19 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.nexgo.oaf.apiv3.device.reader.CardSlotTypeEnum;
import com.utsmm.kbz.ui.pinpad.PinPadViewModel;
import com.utsmm.kbz.util.TransactionUtil;
import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmyanmar.baselib.util.TerminalUtil;
import com.utsmyanmar.baselib.util.TimeoutCallback;
import com.utsmyanmar.checkxread.checkcard.CheckCardResultX;
import com.utsmyanmar.checkxread.model.CardDataX;
import com.utsmyanmar.checkxread.readcard.MPUXReadCard;
import com.utsmyanmar.checkxread.readcard.ReadCardResultX;
import com.utsmyanmar.checkxread.sdk.NexGoSDK;
import com.utsmyanmar.checkxread.util.CardTypeX;
import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
import com.utsmm.kbz.BR;
@ -37,6 +45,8 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
private TransProcessViewModel transProcessViewModel;
private PinPadViewModel pinPadViewModel;
private static final String TAG = CardWaitingFragment.class.getSimpleName();
private static final int cardWaitingTimeOut = 60;
@ -59,6 +69,8 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
transProcessViewModel = getFragmentScopeViewModel(TransProcessViewModel.class);
pinPadViewModel = getFragmentScopeViewModel(PinPadViewModel.class);
}
@Override
@ -236,6 +248,7 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
allType.add(CardSlotTypeEnum.RF);
// int allType = AidlConstants.CardType.IC.getValue() | AidlConstants.CardType.MAGNETIC.getValue();
cardReadViewModel.startCheckXProcessNex(allType, cardWaitingTimeOut + 5, new CheckCardResultX() {
@Override
public void onSuccess(CardTypeX cardType, boolean isMPU) {
@ -267,7 +280,7 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
sharedViewModel.isEmv.setValue(false);
cardReadViewModel.setCardTransactionType(CardTransactionType.MPU);
} else {
// cardReadViewModel.cardTypeData.setValue(cardType.value);
// cardReadViewModel.cardTypeData.postValue(cardType.value);
cardReadViewModel.setCardTransactionType(CardTransactionType.EMV);
}
// cardReadViewModel.cardTypeData.postValue(cardType.value);

View File

@ -16,6 +16,7 @@ import com.utsmyanmar.baselib.ui.CustomPinPadKeyboard;
import com.utsmyanmar.baselib.ui.ListDialog;
import com.utsmyanmar.baselib.util.CardDetectCallback;
import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmyanmar.checkxread.sdk.NexGoSDK;
import com.utsmyanmar.checkxread.util.CardTypeX;
import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.TradeData;
@ -134,6 +135,8 @@ public class EmvTransactionFragment extends DataBindingFragment {
emvTransactionViewModel.customPinPadKeyboard = binding.customPinPad;
initSharedData();
initData();

View File

@ -1,19 +1,27 @@
package com.utsmm.kbz.ui.core_ui;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.nexgo.oaf.apiv3.device.reader.CardSlotTypeEnum;
import com.utsmm.kbz.config.data.model.CardTransactionType;
import com.utsmm.kbz.util.MockData;
import com.utsmm.kbz.util.ecr.CoreUtils;
import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmyanmar.baselib.util.TerminalUtil;
import com.utsmyanmar.checkxread.checkcard.CheckCardResultX;
import com.utsmyanmar.checkxread.model.CardDataX;
import com.utsmyanmar.checkxread.readcard.MAGXReadCard;
import com.utsmyanmar.checkxread.readcard.MPUXReadCard;
import com.utsmyanmar.checkxread.readcard.ReadCardResultX;
import com.utsmyanmar.checkxread.sdk.NexGoSDK;
import com.utsmyanmar.checkxread.util.CardTypeX;
import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.TradeData;
@ -35,6 +43,8 @@ import com.utsmm.kbz.util.TransactionUtil;
import com.utsmyanmar.paylibs.utils.LogUtil;
import java.util.HashSet;
public class ProcessingCardFragment extends DataBindingFragment {
private static final String TAG = ProcessingCardFragment.class.getSimpleName();
private CardReadViewModel cardReadViewModel;
@ -97,7 +107,8 @@ public class ProcessingCardFragment extends DataBindingFragment {
private void checkCardTransactionType() {
switch (cardReadViewModel.getCardTransactionType()) {
case MPU: readMPUCard();
case MPU:
readMPUCard();
break;
case EMV: handlePreEmvProcess();
break;
@ -109,6 +120,15 @@ public class ProcessingCardFragment extends DataBindingFragment {
break;
}
}
private void processMPU(){
if(sharedViewModel.getAmountExist().getValue() != null && !sharedViewModel.getAmountExist().getValue()) {
routeId = R.id.action_processingCardFragment_to_inputAmountFragment;
}
routeId = R.id.action_processingCardFragment_to_pinPadFragment;
safeNavigateToRouteId();
}
private void mockMPUCard() {
LogUtil.d(TAG,"initialize mock card data...");
routeId = R.id.action_processingCardFragment_to_pinPadFragment;
@ -129,10 +149,13 @@ public class ProcessingCardFragment extends DataBindingFragment {
@Override
public void onSuccess(CardDataX cardDataX) {
if(!TransactionUtil.getInstance().getBinList().isEmpty()) {
if(TransactionUtil.getInstance().getBinList().contains(cardDataX.getBin())) {
LogUtil.d(TAG," <= contain bin => ");
handlePreEmvProcess();
if(!TerminalUtil.getInstance().getBinList().isEmpty()) {
if(TerminalUtil.getInstance().getBinList().contains(cardDataX.getBin())) {
LogUtil.d(TAG," <= BIN found in list, switching to EMV process");
cardReadViewModel.cancelCheckCard();
initCheckCard();
return;
}
}
@ -273,20 +296,70 @@ public class ProcessingCardFragment extends DataBindingFragment {
}
private void initCheckCard() {
HashSet<CardSlotTypeEnum> allType = new HashSet<>();
allType.add(CardSlotTypeEnum.ICC1);
cardReadViewModel.startCheckXProcessNex(allType, 60, new CheckCardResultX() {
@Override
public void onSuccess(CardTypeX cardType, boolean isMPU) {
LogUtil.d(TAG,"**** on success *****");
LogUtil.d(TAG,"card type:"+cardType);
LogUtil.d(TAG,"is MPU:"+isMPU);
// delayFunctionCall(()->{
//
// });
handlePreEmvProcess();
}
@Override
public void onError(int code, String message) {
LogUtil.d(TAG,"on error:"+code+" - message :"+message);
showDeclineDialog(message);
routeId = R.id.action_processingCardFragment_to_errorFragment;
safeNavigateToRouteId();
}
@Override
public void onCommError() {
LogUtil.d(TAG,"on Comm Error...");
ecrActionCancel(getResourceString(R.string.txt_cancel_trans));
showDeclineDialog("Chip not detected!");
routeId = R.id.action_processingCardFragment_to_errorFragment;
safeNavigateToRouteId();
}
});
}
private void prepareEmvTransaction() {
sharedViewModel.isEmv.postValue(true);
// cardReadViewModel.cardTypeData.observe(getViewLifecycleOwner(), cardType -> {
// TradeData tradeData = Params.newTrade(false);
// PayDetail payDetail = tradeData.getPayDetail();
cardReadViewModel.cardTypeData.observe(getViewLifecycleOwner(), cardType -> {
TradeData tradeData = Params.newTrade(false);
PayDetail payDetail = tradeData.getPayDetail();
payDetail.setCardType(cardType);
emvTransactionViewModel.setTradeData(tradeData);
});
// TradeData tradeData = Params.newTrade(false);
// PayDetail payDetail = tradeData.getPayDetail();
//
// payDetail.setCardType(cardType);
// emvTransactionViewModel.setTradeData(tradeData);
// });
// payDetail.setCardType(cardReadViewModel.cardTypeData.getValue());
// emvTransactionViewModel.setTradeData(tradeData);
}
TradeData tradeData = Params.newTrade(false);
PayDetail payDetail = tradeData.getPayDetail();
private void ecrActionCancel(String msg) {
if (sharedViewModel.isEcr.getValue() != null) {
payDetail.setCardType(cardReadViewModel.cardTypeData.getValue());
emvTransactionViewModel.setTradeData(tradeData);
if (sharedViewModel.isEcr.getValue()) {
sharedViewModel.isEcr.postValue(false);
CoreUtils.getInstance(sharedViewModel).responseRejectMsg(msg);
sharedViewModel.isEcrFinished.postValue(true);
}
}
}
}

View File

@ -104,4 +104,43 @@ public class CardReadViewModel extends ViewModel {
NexGoSDK.getInstance().cancelCheckCard();
}
/**
* Properly cleanup card reading operations with sequential steps
*/
public void performCompleteCleanup(Runnable onCleanupComplete) {
// Step 1: Cancel check card operations
NexGoSDK.getInstance().cancelCheckCard();
// Step 2: Cancel X process operations
cancelCheckXProcess();
// Step 3: Reset internal flags and state
resetOneTimeFlag();
resetUI();
// Step 4: Wait for SDK to be ready before proceeding
if (onCleanupComplete != null) {
waitForSDKReady(onCleanupComplete, 0);
}
}
/**
* Wait for SDK to be ready with timeout
*/
private void waitForSDKReady(Runnable callback, int retryCount) {
final int MAX_RETRIES = 10; // Max 2 seconds (10 * 200ms)
if (NexGoSDK.getInstance().isSDKReady() || retryCount >= MAX_RETRIES) {
// SDK is ready or we've reached max retries
if (retryCount >= MAX_RETRIES) {
// Log warning if we reached max retries
android.util.Log.w(TAG, "SDK readiness check timed out after " + (MAX_RETRIES * 200) + "ms");
}
callback.run();
} else {
// Wait a bit more and check again
mainThreadHandler.postDelayed(() -> waitForSDKReady(callback, retryCount + 1), 200);
}
}
}

View File

@ -143,25 +143,25 @@ public class TransactionUtil {
return payDetail;
}
public static List<String> binParser(String input) {
if (input == null || input.trim().isEmpty()) {
return new ArrayList<>();
}
String[] parts = input.split("[,/\\-]");
return Arrays.stream(parts)
.map(String::trim)
.filter(s -> !s.isEmpty())
.collect(Collectors.toList());
}
public List<String> getBinList() {
if(SystemParamsOperation.getInstance().getBinValues() == null || SystemParamsOperation.getInstance().getBinValues().isEmpty())
return new ArrayList<>();
else
return binParser(SystemParamsOperation.getInstance().getBinValues());
}
// public static List<String> binParser(String input) {
//
// if (input == null || input.trim().isEmpty()) {
// return new ArrayList<>();
// }
// String[] parts = input.split("[,/\\-]");
//
// return Arrays.stream(parts)
// .map(String::trim)
// .filter(s -> !s.isEmpty())
// .collect(Collectors.toList());
// }
//
// public List<String> getBinList() {
// if(SystemParamsOperation.getInstance().getBinValues() == null || SystemParamsOperation.getInstance().getBinValues().isEmpty())
// return new ArrayList<>();
// else
// return binParser(SystemParamsOperation.getInstance().getBinValues());
// }
}

View File

@ -258,6 +258,7 @@
android:id="@+id/action_emvTransactionFragment_to_pinPadFragment"
app:destination="@id/pinPadFragment" />
</fragment>
<!-- New SelectSettlementFragment -->
<fragment
@ -986,6 +987,8 @@
app:popUpToInclusive="true"
android:id="@+id/action_processingCardFragment_to_inputAmountFragment"
app:destination="@id/inputAmountFragment" />
</fragment>
<fragment
tools:layout="@layout/fragment_delete_key"
@ -1221,4 +1224,5 @@
android:id="@+id/action_QRRefundProcessFragment_to_nav_main"
app:destination="@id/nav_main" />
</fragment>
</navigation>

View File

@ -130,11 +130,11 @@ public class ParamOperation {
rxHelper.queryData(paramRepository.getAll(), new RxCallbackX<List<T>>() {
@Override
public void onSuccess(List<T> data) {
if (data != null && !data.isEmpty()) {
LogUtil.d(TAG, clazz.getSimpleName() + " loaded from DB: " + data.size());
result.onSuccess(data);
return;
}
// if (data != null && !data.isEmpty()) {
// LogUtil.d(TAG, clazz.getSimpleName() + " loaded from DB: " + data.size());
// result.onSuccess(data);
// return;
// }
List<T> list = loadJsonConfig(id, clazz);
deleteAll(rxHelper, paramRepository, new RxCallbackUpdateX() {
@Override

View File

@ -4,7 +4,13 @@ import android.os.RemoteException;
import com.nexgo.oaf.apiv3.device.beeper.Beeper;
import com.utsmyanmar.baselib.BaseApplication;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class TerminalUtil {
@ -49,4 +55,24 @@ public class TerminalUtil {
public String generateRandomNumbers() {
return terminalUtils.generateRandom();
}
public static List<String> binParser(String input) {
if (input == null || input.trim().isEmpty()) {
return new ArrayList<>();
}
String[] parts = input.split("[,/\\-]");
return Arrays.stream(parts)
.map(String::trim)
.filter(s -> !s.isEmpty())
.collect(Collectors.toList());
}
public List<String> getBinList() {
if(SystemParamsOperation.getInstance().getBinValues() == null || SystemParamsOperation.getInstance().getBinValues().isEmpty())
return new ArrayList<>();
else
return binParser(SystemParamsOperation.getInstance().getBinValues());
}
}

View File

@ -27,5 +27,6 @@ public enum EmvResultStatus {
OFFLINE_APPROVE,
OFFLINE_DECLINE,
CONFIRM_CODE_VERIFY
CONFIRM_CODE_VERIFY,
MPU_CARD
}

View File

@ -43,6 +43,7 @@ import com.utsmyanmar.baselib.emv.EmvParamOperation;
import com.utsmyanmar.baselib.emv.ParamHelper;
import com.utsmyanmar.baselib.repo.Repository;
import com.utsmyanmar.baselib.ui.CustomPinPadKeyboard;
import com.utsmyanmar.baselib.util.TerminalUtil;
import com.utsmyanmar.baselib.util.enums.EmvResultStatus;
import com.utsmyanmar.baselib.util.enums.PinUtil;
import com.utsmyanmar.baselib.util.rx_helper.ProcessSingleDataResult;
@ -217,6 +218,11 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
addEndTime("initEmvTlvData");
}
public void cancelEmvProcess() {
emvHandler.emvProcessCancel();
emvHandler.emvProcessAbort();
}
private void startEmvNex() {
String inputAmount = String.valueOf(mPayDetail.getAmount());
EmvTransConfigurationEntity transData = new EmvTransConfigurationEntity();
@ -250,11 +256,15 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
unionPayTransDataEntity.setContactlessQpsLimit("000090000000");
transData.setUnionPayTransDataEntity(unionPayTransDataEntity);
// emvHandler.contactlessConfigKernelId(EmvCardBrandEnum.EMV_CARD_BRAND_JCB,(byte) 0x01,ByteUtils.hexString2ByteArray("06"));
emvHandler.contactlessAppendAidIntoKernel(EmvCardBrandEnum.EMV_CARD_BRAND_MASTER, (byte) 0x08, ByteUtils.hexString2ByteArray("A000000732100123"));
LogUtil.d(TAG, "TransData :" + transData.getTransAmount());
LogUtil.d(TAG, "start emv ");
emvHandler.emvProcess(transData, emvProcessListener);
}
private void initData() {
@ -671,6 +681,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
LogUtil.d(TAG, "onConfirmCardNo :" + cardInfoEntity.getTk2());
LogUtil.d(TAG, "onConfirmCardNo :" + cardInfoEntity.getCardNo());
cardNo = cardInfoEntity.getCardNo();
if (mPayDetail.getCardType() == CardTypeX.NFC.value) {
cardNum.postValue(cardInfoEntity.getCardNo());
@ -936,6 +947,8 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
KernelDataProcessUtil.fillTradeDataInfo(cardInfo, mTradeData);
cardNum.postValue(mPayDetail.getCardNo());
expDate.postValue(mPayDetail.getEXPDate());
} catch (Exception e) {
e.printStackTrace();
}

View File

@ -482,6 +482,29 @@
"cateCode": "2701",
"currencyCode": "0104"
},
{
"aidEnable": true,
"aid": "A000000333010106",
"cardScheme": "UPI",
"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": "A000000333010108",
@ -527,5 +550,51 @@
"riskManageData": "01",
"cateCode": "2701",
"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": "A0000001570040",
"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"
}
]

View File

@ -41,13 +41,33 @@
},
{
"rid": "A000000065",
"indx": "14",
"indx": "08",
"hashInd": "01",
"arithInd": "00",
"modul": "AEED55B9EE00E1ECEB045F61D2DA9A66AB637B43FB5CDBDB22A2FBB25BE061E937E38244EE5132F530144A3F268907D8FD648863F5A96FED7E42089E93457ADC0E1BC89C58A0DB72675FBC47FEE9FF33C16ADE6D341936B06B6A6F5EF6F66A4EDD981DF75DA8399C3053F430ECA342437C23AF423A211AC9F58EAF09B0F837DE9D86C7109DB1646561AA5AF0289AF5514AC64BC2D9D36A179BB8A7971E2BFA03A9E4B847FD3D63524D43A0E8003547B94A8A75E519DF3177D0A60BC0B4BAB1EA59A2CBB4D2D62354E926E9C7D3BE4181E81BA60F8285A896D17DA8C3242481B6C405769A39D547C74ED9FF95A70A796046B5EFF36682DC29",
"modul": "B74670DAD1DC8983652000E5A7F2F8B35DFD083EE593E5BA895C95729F2BADE9C8ABF3DD9CE240C451C6CEFFC768D83CBAC76ABB8FEA58F013C647007CFF7617BAC2AE3981816F25CC7E5238EF34C4F02D0B01C24F80C2C65E7E7743A4FA8E23206A23ECE290C26EA56DB085C5C5EAE26292451FC8292F9957BE8FF20FAD53E5",
"exponent": "03",
"expDate": "3230333031323331",
"checkSum": "43A3151513B7ADCEB92DBEA2A262CEB336D26C83"
"checkSum": "DD36D5896228C8C4900742F107E2F91FE50BC7EE"
},
{
"rid": "A000000065",
"indx": "09",
"hashInd": "01",
"arithInd": "00",
"modul": "B72A8FEF5B27F2B550398FDCC256F714BAD497FF56094B7408328CB626AA6F0E6A9DF8388EB9887BC930170BCC1213E90FC070D52C8DCD0FF9E10FAD36801FE93FC998A721705091F18BC7C98241CADC15A2B9DA7FB963142C0AB640D5D0135E77EBAE95AF1B4FEFADCF9C012366BDDA0455C1564A68810D7127676D493890BD",
"exponent": "03",
"expDate": "3230333031323331",
"checkSum": "4410C6D51C2F83ADFD92528FA6E38A32DF048D0A"
},
{
"rid": "A000000065",
"indx": "10",
"hashInd": "01",
"arithInd": "00",
"modul": "99B63464EE0B4957E4FD23BF923D12B61469B8FFF8814346B2ED6A780F8988EA9CF0433BC1E655F05EFA66D0C98098F25B659D7A25B8478A36E489760D071F54CDF7416948ED733D816349DA2AADDA227EE45936203CBF628CD033AABA5E5A6E4AE37FBACB4611B4113ED427529C636F6C3304F8ABDD6D9AD660516AE87F7F2DDF1D2FA44C164727E56BBC9BA23C0285",
"exponent": "03",
"expDate": "3230333031323331",
"checkSum": "C75E5210CBE6E8F0594A0F1911B07418CADB5BAB"
},
{
"rid": "A000000065",
@ -59,6 +79,16 @@
"expDate": "3230333031323331",
"checkSum": "D9FD62C9DD4E6DE7741E9A17FB1FF2C5DB948BCB"
},
{
"rid": "A000000065",
"indx": "14",
"hashInd": "01",
"arithInd": "00",
"modul": "AEED55B9EE00E1ECEB045F61D2DA9A66AB637B43FB5CDBDB22A2FBB25BE061E937E38244EE5132F530144A3F268907D8FD648863F5A96FED7E42089E93457ADC0E1BC89C58A0DB72675FBC47FEE9FF33C16ADE6D341936B06B6A6F5EF6F66A4EDD981DF75DA8399C3053F430ECA342437C23AF423A211AC9F58EAF09B0F837DE9D86C7109DB1646561AA5AF0289AF5514AC64BC2D9D36A179BB8A7971E2BFA03A9E4B847FD3D63524D43A0E8003547B94A8A75E519DF3177D0A60BC0B4BAB1EA59A2CBB4D2D62354E926E9C7D3BE4181E81BA60F8285A896D17DA8C3242481B6C405769A39D547C74ED9FF95A70A796046B5EFF36682DC29",
"exponent": "03",
"expDate": "3230333031323331",
"checkSum": "43A3151513B7ADCEB92DBEA2A262CEB336D26C83"
},
{
"rid": "A000000003",
"indx": "92",

View File

@ -34,6 +34,8 @@ public class CheckXRead {
// readCard.readCard(SunmiSDK.getInstance(),readCardResultX);
}
public void startCheckXProcess(int allType, int timer, CheckCardResultX checkCardResultX) {
// CheckCardX.getInstance().startCheckProcess(allType,timer,checkCardResultX);
}

View File

@ -30,12 +30,28 @@ public class NexGoSDK implements SDKFeatures {
public Beeper beeper;
boolean powerOn = false;
private boolean isReaderBusy = false;
public void initSDK(CardReader cardReader, Beeper beeper, CPUCardHandler cpuCardHandler) {
this.cardReader = cardReader;
this.beeper = beeper;
this.cpuCardHandler = cpuCardHandler;
}
/**
* Check if SDK is ready for new operations
*/
public boolean isSDKReady() {
return !isReaderBusy && cardReader != null && cpuCardHandler != null;
}
/**
* Set reader busy state
*/
public void setReaderBusy(boolean busy) {
this.isReaderBusy = busy;
}
@Override
public int sendAPDU(APDUXRequest apduxRequest, APDUXResponse apduxResponse) {
@ -88,10 +104,30 @@ public class NexGoSDK implements SDKFeatures {
@Override
public void cancelCheckCard() {
powerOn = false;
cpuCardHandler.powerOff();
cardReader.stopSearch();
Log.d(TAG, "cancelCheckCard called - starting cleanup sequence");
setReaderBusy(true);
try {
powerOn = false;
if (cpuCardHandler != null) {
cpuCardHandler.powerOff();
}
if (cardReader != null) {
cardReader.stopSearch();
}
closeReader();
Log.d(TAG, "cancelCheckCard cleanup completed successfully");
} catch (Exception e) {
Log.e(TAG, "Error during cancelCheckCard cleanup: " + e.getMessage());
} finally {
// Mark reader as not busy after cleanup
android.os.Handler handler = new android.os.Handler(android.os.Looper.getMainLooper());
handler.postDelayed(() -> {
setReaderBusy(false);
Log.d(TAG, "SDK ready for new operations");
}, 200); // 200ms delay to ensure cleanup is complete
}
}
@Override
@ -108,5 +144,8 @@ public class NexGoSDK implements SDKFeatures {
public void closeReader() {
cardReader.close(CardSlotTypeEnum.ICC1);
cardReader.close(CardSlotTypeEnum.RF);
cpuCardHandler.powerOff();
}
}

View File

@ -353,11 +353,12 @@ public class DecodePackage {
if (outField.getLengthType() > 0) {
int varLen;
if( hostName == HostName.BPC) {
if(outField.getFieldPos() == 55) {
varLen = (outField.getLengthType() + 1) / 2;
} else {
varLen = outField.getLengthType();
}
varLen = outField.getLengthType();
// if(outField.getFieldPos() == 55) {
// varLen = (outField.getLengthType() + 1) / 2;
// } else {
// varLen = outField.getLengthType();
// }
} else {
varLen = (outField.getLengthType() + 1) / 2;

View File

@ -1382,4 +1382,15 @@ public class PayDetail implements Serializable {
this.cardSettleData = cardSettleData;
}
public String getBin(String cardNo) {
String bin = "";
if (cardNo != null) {
if (cardNo.length() >= 6) {
bin = cardNo.substring(0, 6);
System.out.println("BIN: " + bin);
}
}
return bin;
}
}