Fixed Bin List issues
This commit is contained in:
parent
8e93e61eb5
commit
67fc55800a
@ -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" />
|
||||
|
||||
@ -54,7 +54,7 @@ android {
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
debug {
|
||||
debuggable false
|
||||
debuggable true
|
||||
}
|
||||
}
|
||||
compileOptions {
|
||||
|
||||
@ -112,6 +112,7 @@ public class ExampleInstrumentedTest {
|
||||
|
||||
String resp = "0071600000051730323130723000000A80820031363437363137333130303030303030323730303030303030303030303030353530303030313039313634353532303030303033323630313039313731353532303031303030303735343431393130303030343733343531303400048A023936";
|
||||
|
||||
resp = "00DB600000051730323130723000000A80820031363335373130353030333938393032373030303030303030303030303030353030303030313230313633323039303030303133323630313230313633323033303031303030303832333632393130383132333037313431303401105F2A02010482021C008407A00000006510109505808800E0009A032601209C01009F02060000000500009F03060000000000009F100807010104A09000B09F1A0201049F26080611D1D33562865F9F2701809F3303E0E8C89F34031E03009F360200049F37045A647F128A023936";
|
||||
byte[] response = ByteUtil.hexStr2Bytes(resp);
|
||||
|
||||
String bitmap = BitmapConfig.BPC_SALE;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -103,5 +103,44 @@ public class CardReadViewModel extends ViewModel {
|
||||
public void cancelCheckCard(){
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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());
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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>
|
||||
@ -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
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,5 +27,6 @@ public enum EmvResultStatus {
|
||||
OFFLINE_APPROVE,
|
||||
OFFLINE_DECLINE,
|
||||
|
||||
CONFIRM_CODE_VERIFY
|
||||
CONFIRM_CODE_VERIFY,
|
||||
MPU_CARD
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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"
|
||||
}
|
||||
]
|
||||
@ -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",
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -30,11 +30,27 @@ 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
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user