Fixed Bin List issues
This commit is contained in:
parent
8e93e61eb5
commit
67fc55800a
@ -4,7 +4,18 @@
|
|||||||
<selectionStates>
|
<selectionStates>
|
||||||
<SelectionState runConfigName="app">
|
<SelectionState runConfigName="app">
|
||||||
<option name="selectionMode" value="DROPDOWN" />
|
<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">
|
<Target type="DEFAULT_BOOT">
|
||||||
<handle>
|
<handle>
|
||||||
<DeviceId pluginId="PhysicalDevice" identifier="serial=0123456789ABCDEF" />
|
<DeviceId pluginId="PhysicalDevice" identifier="serial=0123456789ABCDEF" />
|
||||||
|
|||||||
@ -54,7 +54,7 @@ android {
|
|||||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
}
|
}
|
||||||
debug {
|
debug {
|
||||||
debuggable false
|
debuggable true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compileOptions {
|
compileOptions {
|
||||||
|
|||||||
@ -112,6 +112,7 @@ public class ExampleInstrumentedTest {
|
|||||||
|
|
||||||
String resp = "0071600000051730323130723000000A80820031363437363137333130303030303030323730303030303030303030303030353530303030313039313634353532303030303033323630313039313731353532303031303030303735343431393130303030343733343531303400048A023936";
|
String resp = "0071600000051730323130723000000A80820031363437363137333130303030303030323730303030303030303030303030353530303030313039313634353532303030303033323630313039313731353532303031303030303735343431393130303030343733343531303400048A023936";
|
||||||
|
|
||||||
|
resp = "00DB600000051730323130723000000A80820031363335373130353030333938393032373030303030303030303030303030353030303030313230313633323039303030303133323630313230313633323033303031303030303832333632393130383132333037313431303401105F2A02010482021C008407A00000006510109505808800E0009A032601209C01009F02060000000500009F03060000000000009F100807010104A09000B09F1A0201049F26080611D1D33562865F9F2701809F3303E0E8C89F34031E03009F360200049F37045A647F128A023936";
|
||||||
byte[] response = ByteUtil.hexStr2Bytes(resp);
|
byte[] response = ByteUtil.hexStr2Bytes(resp);
|
||||||
|
|
||||||
String bitmap = BitmapConfig.BPC_SALE;
|
String bitmap = BitmapConfig.BPC_SALE;
|
||||||
|
|||||||
@ -8,11 +8,19 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import com.nexgo.oaf.apiv3.device.reader.CardSlotTypeEnum;
|
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.fragment.DataBindingFragment;
|
||||||
import com.utsmyanmar.baselib.util.DataBindingConfig;
|
import com.utsmyanmar.baselib.util.DataBindingConfig;
|
||||||
|
import com.utsmyanmar.baselib.util.TerminalUtil;
|
||||||
import com.utsmyanmar.baselib.util.TimeoutCallback;
|
import com.utsmyanmar.baselib.util.TimeoutCallback;
|
||||||
import com.utsmyanmar.checkxread.checkcard.CheckCardResultX;
|
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.checkxread.util.CardTypeX;
|
||||||
|
import com.utsmyanmar.paylibs.model.TradeData;
|
||||||
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
|
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
|
||||||
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
|
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
|
||||||
import com.utsmm.kbz.BR;
|
import com.utsmm.kbz.BR;
|
||||||
@ -37,6 +45,8 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
|
|||||||
|
|
||||||
private TransProcessViewModel transProcessViewModel;
|
private TransProcessViewModel transProcessViewModel;
|
||||||
|
|
||||||
|
private PinPadViewModel pinPadViewModel;
|
||||||
|
|
||||||
private static final String TAG = CardWaitingFragment.class.getSimpleName();
|
private static final String TAG = CardWaitingFragment.class.getSimpleName();
|
||||||
|
|
||||||
private static final int cardWaitingTimeOut = 60;
|
private static final int cardWaitingTimeOut = 60;
|
||||||
@ -59,6 +69,8 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
|
|||||||
|
|
||||||
transProcessViewModel = getFragmentScopeViewModel(TransProcessViewModel.class);
|
transProcessViewModel = getFragmentScopeViewModel(TransProcessViewModel.class);
|
||||||
|
|
||||||
|
pinPadViewModel = getFragmentScopeViewModel(PinPadViewModel.class);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -236,6 +248,7 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
|
|||||||
allType.add(CardSlotTypeEnum.RF);
|
allType.add(CardSlotTypeEnum.RF);
|
||||||
// int allType = AidlConstants.CardType.IC.getValue() | AidlConstants.CardType.MAGNETIC.getValue();
|
// int allType = AidlConstants.CardType.IC.getValue() | AidlConstants.CardType.MAGNETIC.getValue();
|
||||||
|
|
||||||
|
|
||||||
cardReadViewModel.startCheckXProcessNex(allType, cardWaitingTimeOut + 5, new CheckCardResultX() {
|
cardReadViewModel.startCheckXProcessNex(allType, cardWaitingTimeOut + 5, new CheckCardResultX() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(CardTypeX cardType, boolean isMPU) {
|
public void onSuccess(CardTypeX cardType, boolean isMPU) {
|
||||||
@ -267,7 +280,7 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
|
|||||||
sharedViewModel.isEmv.setValue(false);
|
sharedViewModel.isEmv.setValue(false);
|
||||||
cardReadViewModel.setCardTransactionType(CardTransactionType.MPU);
|
cardReadViewModel.setCardTransactionType(CardTransactionType.MPU);
|
||||||
} else {
|
} else {
|
||||||
// cardReadViewModel.cardTypeData.setValue(cardType.value);
|
// cardReadViewModel.cardTypeData.postValue(cardType.value);
|
||||||
cardReadViewModel.setCardTransactionType(CardTransactionType.EMV);
|
cardReadViewModel.setCardTransactionType(CardTransactionType.EMV);
|
||||||
}
|
}
|
||||||
// cardReadViewModel.cardTypeData.postValue(cardType.value);
|
// 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.ui.ListDialog;
|
||||||
import com.utsmyanmar.baselib.util.CardDetectCallback;
|
import com.utsmyanmar.baselib.util.CardDetectCallback;
|
||||||
import com.utsmyanmar.baselib.util.DataBindingConfig;
|
import com.utsmyanmar.baselib.util.DataBindingConfig;
|
||||||
|
import com.utsmyanmar.checkxread.sdk.NexGoSDK;
|
||||||
import com.utsmyanmar.checkxread.util.CardTypeX;
|
import com.utsmyanmar.checkxread.util.CardTypeX;
|
||||||
import com.utsmyanmar.paylibs.model.PayDetail;
|
import com.utsmyanmar.paylibs.model.PayDetail;
|
||||||
import com.utsmyanmar.paylibs.model.TradeData;
|
import com.utsmyanmar.paylibs.model.TradeData;
|
||||||
@ -134,6 +135,8 @@ public class EmvTransactionFragment extends DataBindingFragment {
|
|||||||
|
|
||||||
emvTransactionViewModel.customPinPadKeyboard = binding.customPinPad;
|
emvTransactionViewModel.customPinPadKeyboard = binding.customPinPad;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
initSharedData();
|
initSharedData();
|
||||||
|
|
||||||
initData();
|
initData();
|
||||||
|
|||||||
@ -1,19 +1,27 @@
|
|||||||
package com.utsmm.kbz.ui.core_ui;
|
package com.utsmm.kbz.ui.core_ui;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
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.MockData;
|
||||||
|
import com.utsmm.kbz.util.ecr.CoreUtils;
|
||||||
import com.utsmyanmar.baselib.fragment.DataBindingFragment;
|
import com.utsmyanmar.baselib.fragment.DataBindingFragment;
|
||||||
import com.utsmyanmar.baselib.util.DataBindingConfig;
|
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.model.CardDataX;
|
||||||
import com.utsmyanmar.checkxread.readcard.MAGXReadCard;
|
import com.utsmyanmar.checkxread.readcard.MAGXReadCard;
|
||||||
import com.utsmyanmar.checkxread.readcard.MPUXReadCard;
|
import com.utsmyanmar.checkxread.readcard.MPUXReadCard;
|
||||||
import com.utsmyanmar.checkxread.readcard.ReadCardResultX;
|
import com.utsmyanmar.checkxread.readcard.ReadCardResultX;
|
||||||
|
import com.utsmyanmar.checkxread.sdk.NexGoSDK;
|
||||||
import com.utsmyanmar.checkxread.util.CardTypeX;
|
import com.utsmyanmar.checkxread.util.CardTypeX;
|
||||||
import com.utsmyanmar.paylibs.model.PayDetail;
|
import com.utsmyanmar.paylibs.model.PayDetail;
|
||||||
import com.utsmyanmar.paylibs.model.TradeData;
|
import com.utsmyanmar.paylibs.model.TradeData;
|
||||||
@ -35,6 +43,8 @@ import com.utsmm.kbz.util.TransactionUtil;
|
|||||||
|
|
||||||
import com.utsmyanmar.paylibs.utils.LogUtil;
|
import com.utsmyanmar.paylibs.utils.LogUtil;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
public class ProcessingCardFragment extends DataBindingFragment {
|
public class ProcessingCardFragment extends DataBindingFragment {
|
||||||
private static final String TAG = ProcessingCardFragment.class.getSimpleName();
|
private static final String TAG = ProcessingCardFragment.class.getSimpleName();
|
||||||
private CardReadViewModel cardReadViewModel;
|
private CardReadViewModel cardReadViewModel;
|
||||||
@ -97,7 +107,8 @@ public class ProcessingCardFragment extends DataBindingFragment {
|
|||||||
|
|
||||||
private void checkCardTransactionType() {
|
private void checkCardTransactionType() {
|
||||||
switch (cardReadViewModel.getCardTransactionType()) {
|
switch (cardReadViewModel.getCardTransactionType()) {
|
||||||
case MPU: readMPUCard();
|
case MPU:
|
||||||
|
readMPUCard();
|
||||||
break;
|
break;
|
||||||
case EMV: handlePreEmvProcess();
|
case EMV: handlePreEmvProcess();
|
||||||
break;
|
break;
|
||||||
@ -109,6 +120,15 @@ public class ProcessingCardFragment extends DataBindingFragment {
|
|||||||
break;
|
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() {
|
private void mockMPUCard() {
|
||||||
LogUtil.d(TAG,"initialize mock card data...");
|
LogUtil.d(TAG,"initialize mock card data...");
|
||||||
routeId = R.id.action_processingCardFragment_to_pinPadFragment;
|
routeId = R.id.action_processingCardFragment_to_pinPadFragment;
|
||||||
@ -129,10 +149,13 @@ public class ProcessingCardFragment extends DataBindingFragment {
|
|||||||
@Override
|
@Override
|
||||||
public void onSuccess(CardDataX cardDataX) {
|
public void onSuccess(CardDataX cardDataX) {
|
||||||
|
|
||||||
if(!TransactionUtil.getInstance().getBinList().isEmpty()) {
|
if(!TerminalUtil.getInstance().getBinList().isEmpty()) {
|
||||||
if(TransactionUtil.getInstance().getBinList().contains(cardDataX.getBin())) {
|
if(TerminalUtil.getInstance().getBinList().contains(cardDataX.getBin())) {
|
||||||
LogUtil.d(TAG," <= contain bin => ");
|
LogUtil.d(TAG," <= BIN found in list, switching to EMV process");
|
||||||
handlePreEmvProcess();
|
|
||||||
|
cardReadViewModel.cancelCheckCard();
|
||||||
|
initCheckCard();
|
||||||
|
|
||||||
return;
|
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() {
|
private void prepareEmvTransaction() {
|
||||||
sharedViewModel.isEmv.postValue(true);
|
sharedViewModel.isEmv.postValue(true);
|
||||||
// cardReadViewModel.cardTypeData.observe(getViewLifecycleOwner(), cardType -> {
|
cardReadViewModel.cardTypeData.observe(getViewLifecycleOwner(), cardType -> {
|
||||||
// TradeData tradeData = Params.newTrade(false);
|
TradeData tradeData = Params.newTrade(false);
|
||||||
// PayDetail payDetail = tradeData.getPayDetail();
|
PayDetail payDetail = tradeData.getPayDetail();
|
||||||
|
|
||||||
|
payDetail.setCardType(cardType);
|
||||||
|
emvTransactionViewModel.setTradeData(tradeData);
|
||||||
|
});
|
||||||
|
|
||||||
|
// TradeData tradeData = Params.newTrade(false);
|
||||||
|
// PayDetail payDetail = tradeData.getPayDetail();
|
||||||
//
|
//
|
||||||
// payDetail.setCardType(cardType);
|
// payDetail.setCardType(cardReadViewModel.cardTypeData.getValue());
|
||||||
// emvTransactionViewModel.setTradeData(tradeData);
|
// emvTransactionViewModel.setTradeData(tradeData);
|
||||||
// });
|
}
|
||||||
|
|
||||||
TradeData tradeData = Params.newTrade(false);
|
private void ecrActionCancel(String msg) {
|
||||||
PayDetail payDetail = tradeData.getPayDetail();
|
if (sharedViewModel.isEcr.getValue() != null) {
|
||||||
|
|
||||||
payDetail.setCardType(cardReadViewModel.cardTypeData.getValue());
|
if (sharedViewModel.isEcr.getValue()) {
|
||||||
emvTransactionViewModel.setTradeData(tradeData);
|
sharedViewModel.isEcr.postValue(false);
|
||||||
|
CoreUtils.getInstance(sharedViewModel).responseRejectMsg(msg);
|
||||||
|
sharedViewModel.isEcrFinished.postValue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -104,4 +104,43 @@ public class CardReadViewModel extends ViewModel {
|
|||||||
NexGoSDK.getInstance().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;
|
return payDetail;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<String> binParser(String input) {
|
// public static List<String> binParser(String input) {
|
||||||
|
//
|
||||||
if (input == null || input.trim().isEmpty()) {
|
// if (input == null || input.trim().isEmpty()) {
|
||||||
return new ArrayList<>();
|
// return new ArrayList<>();
|
||||||
}
|
// }
|
||||||
String[] parts = input.split("[,/\\-]");
|
// String[] parts = input.split("[,/\\-]");
|
||||||
|
//
|
||||||
return Arrays.stream(parts)
|
// return Arrays.stream(parts)
|
||||||
.map(String::trim)
|
// .map(String::trim)
|
||||||
.filter(s -> !s.isEmpty())
|
// .filter(s -> !s.isEmpty())
|
||||||
.collect(Collectors.toList());
|
// .collect(Collectors.toList());
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
public List<String> getBinList() {
|
// public List<String> getBinList() {
|
||||||
if(SystemParamsOperation.getInstance().getBinValues() == null || SystemParamsOperation.getInstance().getBinValues().isEmpty())
|
// if(SystemParamsOperation.getInstance().getBinValues() == null || SystemParamsOperation.getInstance().getBinValues().isEmpty())
|
||||||
return new ArrayList<>();
|
// return new ArrayList<>();
|
||||||
else
|
// else
|
||||||
return binParser(SystemParamsOperation.getInstance().getBinValues());
|
// return binParser(SystemParamsOperation.getInstance().getBinValues());
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -258,6 +258,7 @@
|
|||||||
android:id="@+id/action_emvTransactionFragment_to_pinPadFragment"
|
android:id="@+id/action_emvTransactionFragment_to_pinPadFragment"
|
||||||
app:destination="@id/pinPadFragment" />
|
app:destination="@id/pinPadFragment" />
|
||||||
|
|
||||||
|
|
||||||
</fragment>
|
</fragment>
|
||||||
<!-- New SelectSettlementFragment -->
|
<!-- New SelectSettlementFragment -->
|
||||||
<fragment
|
<fragment
|
||||||
@ -986,6 +987,8 @@
|
|||||||
app:popUpToInclusive="true"
|
app:popUpToInclusive="true"
|
||||||
android:id="@+id/action_processingCardFragment_to_inputAmountFragment"
|
android:id="@+id/action_processingCardFragment_to_inputAmountFragment"
|
||||||
app:destination="@id/inputAmountFragment" />
|
app:destination="@id/inputAmountFragment" />
|
||||||
|
|
||||||
|
|
||||||
</fragment>
|
</fragment>
|
||||||
<fragment
|
<fragment
|
||||||
tools:layout="@layout/fragment_delete_key"
|
tools:layout="@layout/fragment_delete_key"
|
||||||
@ -1221,4 +1224,5 @@
|
|||||||
android:id="@+id/action_QRRefundProcessFragment_to_nav_main"
|
android:id="@+id/action_QRRefundProcessFragment_to_nav_main"
|
||||||
app:destination="@id/nav_main" />
|
app:destination="@id/nav_main" />
|
||||||
</fragment>
|
</fragment>
|
||||||
|
|
||||||
</navigation>
|
</navigation>
|
||||||
@ -130,11 +130,11 @@ public class ParamOperation {
|
|||||||
rxHelper.queryData(paramRepository.getAll(), new RxCallbackX<List<T>>() {
|
rxHelper.queryData(paramRepository.getAll(), new RxCallbackX<List<T>>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(List<T> data) {
|
public void onSuccess(List<T> data) {
|
||||||
if (data != null && !data.isEmpty()) {
|
// if (data != null && !data.isEmpty()) {
|
||||||
LogUtil.d(TAG, clazz.getSimpleName() + " loaded from DB: " + data.size());
|
// LogUtil.d(TAG, clazz.getSimpleName() + " loaded from DB: " + data.size());
|
||||||
result.onSuccess(data);
|
// result.onSuccess(data);
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
List<T> list = loadJsonConfig(id, clazz);
|
List<T> list = loadJsonConfig(id, clazz);
|
||||||
deleteAll(rxHelper, paramRepository, new RxCallbackUpdateX() {
|
deleteAll(rxHelper, paramRepository, new RxCallbackUpdateX() {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -4,7 +4,13 @@ import android.os.RemoteException;
|
|||||||
|
|
||||||
import com.nexgo.oaf.apiv3.device.beeper.Beeper;
|
import com.nexgo.oaf.apiv3.device.beeper.Beeper;
|
||||||
import com.utsmyanmar.baselib.BaseApplication;
|
import com.utsmyanmar.baselib.BaseApplication;
|
||||||
|
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
|
||||||
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
public class TerminalUtil {
|
public class TerminalUtil {
|
||||||
@ -49,4 +55,24 @@ public class TerminalUtil {
|
|||||||
public String generateRandomNumbers() {
|
public String generateRandomNumbers() {
|
||||||
return terminalUtils.generateRandom();
|
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_APPROVE,
|
||||||
OFFLINE_DECLINE,
|
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.emv.ParamHelper;
|
||||||
import com.utsmyanmar.baselib.repo.Repository;
|
import com.utsmyanmar.baselib.repo.Repository;
|
||||||
import com.utsmyanmar.baselib.ui.CustomPinPadKeyboard;
|
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.EmvResultStatus;
|
||||||
import com.utsmyanmar.baselib.util.enums.PinUtil;
|
import com.utsmyanmar.baselib.util.enums.PinUtil;
|
||||||
import com.utsmyanmar.baselib.util.rx_helper.ProcessSingleDataResult;
|
import com.utsmyanmar.baselib.util.rx_helper.ProcessSingleDataResult;
|
||||||
@ -217,6 +218,11 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
|
|||||||
addEndTime("initEmvTlvData");
|
addEndTime("initEmvTlvData");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void cancelEmvProcess() {
|
||||||
|
emvHandler.emvProcessCancel();
|
||||||
|
emvHandler.emvProcessAbort();
|
||||||
|
}
|
||||||
|
|
||||||
private void startEmvNex() {
|
private void startEmvNex() {
|
||||||
String inputAmount = String.valueOf(mPayDetail.getAmount());
|
String inputAmount = String.valueOf(mPayDetail.getAmount());
|
||||||
EmvTransConfigurationEntity transData = new EmvTransConfigurationEntity();
|
EmvTransConfigurationEntity transData = new EmvTransConfigurationEntity();
|
||||||
@ -250,11 +256,15 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
|
|||||||
unionPayTransDataEntity.setContactlessQpsLimit("000090000000");
|
unionPayTransDataEntity.setContactlessQpsLimit("000090000000");
|
||||||
transData.setUnionPayTransDataEntity(unionPayTransDataEntity);
|
transData.setUnionPayTransDataEntity(unionPayTransDataEntity);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 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) 0x08, ByteUtils.hexString2ByteArray("A000000732100123"));
|
emvHandler.contactlessAppendAidIntoKernel(EmvCardBrandEnum.EMV_CARD_BRAND_MASTER, (byte) 0x08, ByteUtils.hexString2ByteArray("A000000732100123"));
|
||||||
LogUtil.d(TAG, "TransData :" + transData.getTransAmount());
|
LogUtil.d(TAG, "TransData :" + transData.getTransAmount());
|
||||||
LogUtil.d(TAG, "start emv ");
|
LogUtil.d(TAG, "start emv ");
|
||||||
emvHandler.emvProcess(transData, emvProcessListener);
|
emvHandler.emvProcess(transData, emvProcessListener);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initData() {
|
private void initData() {
|
||||||
@ -671,6 +681,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
|
|||||||
LogUtil.d(TAG, "onConfirmCardNo :" + cardInfoEntity.getTk2());
|
LogUtil.d(TAG, "onConfirmCardNo :" + cardInfoEntity.getTk2());
|
||||||
LogUtil.d(TAG, "onConfirmCardNo :" + cardInfoEntity.getCardNo());
|
LogUtil.d(TAG, "onConfirmCardNo :" + cardInfoEntity.getCardNo());
|
||||||
|
|
||||||
|
|
||||||
cardNo = cardInfoEntity.getCardNo();
|
cardNo = cardInfoEntity.getCardNo();
|
||||||
if (mPayDetail.getCardType() == CardTypeX.NFC.value) {
|
if (mPayDetail.getCardType() == CardTypeX.NFC.value) {
|
||||||
cardNum.postValue(cardInfoEntity.getCardNo());
|
cardNum.postValue(cardInfoEntity.getCardNo());
|
||||||
@ -936,6 +947,8 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
|
|||||||
KernelDataProcessUtil.fillTradeDataInfo(cardInfo, mTradeData);
|
KernelDataProcessUtil.fillTradeDataInfo(cardInfo, mTradeData);
|
||||||
cardNum.postValue(mPayDetail.getCardNo());
|
cardNum.postValue(mPayDetail.getCardNo());
|
||||||
expDate.postValue(mPayDetail.getEXPDate());
|
expDate.postValue(mPayDetail.getEXPDate());
|
||||||
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -482,6 +482,29 @@
|
|||||||
"cateCode": "2701",
|
"cateCode": "2701",
|
||||||
"currencyCode": "0104"
|
"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,
|
"aidEnable": true,
|
||||||
"aid": "A000000333010108",
|
"aid": "A000000333010108",
|
||||||
@ -527,5 +550,51 @@
|
|||||||
"riskManageData": "01",
|
"riskManageData": "01",
|
||||||
"cateCode": "2701",
|
"cateCode": "2701",
|
||||||
"currencyCode": "0104"
|
"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",
|
"rid": "A000000065",
|
||||||
"indx": "14",
|
"indx": "08",
|
||||||
"hashInd": "01",
|
"hashInd": "01",
|
||||||
"arithInd": "00",
|
"arithInd": "00",
|
||||||
"modul": "AEED55B9EE00E1ECEB045F61D2DA9A66AB637B43FB5CDBDB22A2FBB25BE061E937E38244EE5132F530144A3F268907D8FD648863F5A96FED7E42089E93457ADC0E1BC89C58A0DB72675FBC47FEE9FF33C16ADE6D341936B06B6A6F5EF6F66A4EDD981DF75DA8399C3053F430ECA342437C23AF423A211AC9F58EAF09B0F837DE9D86C7109DB1646561AA5AF0289AF5514AC64BC2D9D36A179BB8A7971E2BFA03A9E4B847FD3D63524D43A0E8003547B94A8A75E519DF3177D0A60BC0B4BAB1EA59A2CBB4D2D62354E926E9C7D3BE4181E81BA60F8285A896D17DA8C3242481B6C405769A39D547C74ED9FF95A70A796046B5EFF36682DC29",
|
"modul": "B74670DAD1DC8983652000E5A7F2F8B35DFD083EE593E5BA895C95729F2BADE9C8ABF3DD9CE240C451C6CEFFC768D83CBAC76ABB8FEA58F013C647007CFF7617BAC2AE3981816F25CC7E5238EF34C4F02D0B01C24F80C2C65E7E7743A4FA8E23206A23ECE290C26EA56DB085C5C5EAE26292451FC8292F9957BE8FF20FAD53E5",
|
||||||
"exponent": "03",
|
"exponent": "03",
|
||||||
"expDate": "3230333031323331",
|
"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",
|
"rid": "A000000065",
|
||||||
@ -59,6 +79,16 @@
|
|||||||
"expDate": "3230333031323331",
|
"expDate": "3230333031323331",
|
||||||
"checkSum": "D9FD62C9DD4E6DE7741E9A17FB1FF2C5DB948BCB"
|
"checkSum": "D9FD62C9DD4E6DE7741E9A17FB1FF2C5DB948BCB"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"rid": "A000000065",
|
||||||
|
"indx": "14",
|
||||||
|
"hashInd": "01",
|
||||||
|
"arithInd": "00",
|
||||||
|
"modul": "AEED55B9EE00E1ECEB045F61D2DA9A66AB637B43FB5CDBDB22A2FBB25BE061E937E38244EE5132F530144A3F268907D8FD648863F5A96FED7E42089E93457ADC0E1BC89C58A0DB72675FBC47FEE9FF33C16ADE6D341936B06B6A6F5EF6F66A4EDD981DF75DA8399C3053F430ECA342437C23AF423A211AC9F58EAF09B0F837DE9D86C7109DB1646561AA5AF0289AF5514AC64BC2D9D36A179BB8A7971E2BFA03A9E4B847FD3D63524D43A0E8003547B94A8A75E519DF3177D0A60BC0B4BAB1EA59A2CBB4D2D62354E926E9C7D3BE4181E81BA60F8285A896D17DA8C3242481B6C405769A39D547C74ED9FF95A70A796046B5EFF36682DC29",
|
||||||
|
"exponent": "03",
|
||||||
|
"expDate": "3230333031323331",
|
||||||
|
"checkSum": "43A3151513B7ADCEB92DBEA2A262CEB336D26C83"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"rid": "A000000003",
|
"rid": "A000000003",
|
||||||
"indx": "92",
|
"indx": "92",
|
||||||
|
|||||||
@ -34,6 +34,8 @@ public class CheckXRead {
|
|||||||
// readCard.readCard(SunmiSDK.getInstance(),readCardResultX);
|
// readCard.readCard(SunmiSDK.getInstance(),readCardResultX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void startCheckXProcess(int allType, int timer, CheckCardResultX checkCardResultX) {
|
public void startCheckXProcess(int allType, int timer, CheckCardResultX checkCardResultX) {
|
||||||
// CheckCardX.getInstance().startCheckProcess(allType,timer,checkCardResultX);
|
// CheckCardX.getInstance().startCheckProcess(allType,timer,checkCardResultX);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,12 +30,28 @@ public class NexGoSDK implements SDKFeatures {
|
|||||||
public Beeper beeper;
|
public Beeper beeper;
|
||||||
|
|
||||||
boolean powerOn = false;
|
boolean powerOn = false;
|
||||||
|
private boolean isReaderBusy = false;
|
||||||
|
|
||||||
public void initSDK(CardReader cardReader, Beeper beeper, CPUCardHandler cpuCardHandler) {
|
public void initSDK(CardReader cardReader, Beeper beeper, CPUCardHandler cpuCardHandler) {
|
||||||
this.cardReader = cardReader;
|
this.cardReader = cardReader;
|
||||||
this.beeper = beeper;
|
this.beeper = beeper;
|
||||||
this.cpuCardHandler = cpuCardHandler;
|
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
|
@Override
|
||||||
public int sendAPDU(APDUXRequest apduxRequest, APDUXResponse apduxResponse) {
|
public int sendAPDU(APDUXRequest apduxRequest, APDUXResponse apduxResponse) {
|
||||||
@ -88,10 +104,30 @@ public class NexGoSDK implements SDKFeatures {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void cancelCheckCard() {
|
public void cancelCheckCard() {
|
||||||
powerOn = false;
|
Log.d(TAG, "cancelCheckCard called - starting cleanup sequence");
|
||||||
cpuCardHandler.powerOff();
|
setReaderBusy(true);
|
||||||
cardReader.stopSearch();
|
|
||||||
|
|
||||||
|
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
|
@Override
|
||||||
@ -108,5 +144,8 @@ public class NexGoSDK implements SDKFeatures {
|
|||||||
public void closeReader() {
|
public void closeReader() {
|
||||||
cardReader.close(CardSlotTypeEnum.ICC1);
|
cardReader.close(CardSlotTypeEnum.ICC1);
|
||||||
cardReader.close(CardSlotTypeEnum.RF);
|
cardReader.close(CardSlotTypeEnum.RF);
|
||||||
|
cpuCardHandler.powerOff();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -353,11 +353,12 @@ public class DecodePackage {
|
|||||||
if (outField.getLengthType() > 0) {
|
if (outField.getLengthType() > 0) {
|
||||||
int varLen;
|
int varLen;
|
||||||
if( hostName == HostName.BPC) {
|
if( hostName == HostName.BPC) {
|
||||||
if(outField.getFieldPos() == 55) {
|
varLen = outField.getLengthType();
|
||||||
varLen = (outField.getLengthType() + 1) / 2;
|
// if(outField.getFieldPos() == 55) {
|
||||||
} else {
|
// varLen = (outField.getLengthType() + 1) / 2;
|
||||||
varLen = outField.getLengthType();
|
// } else {
|
||||||
}
|
// varLen = outField.getLengthType();
|
||||||
|
// }
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
varLen = (outField.getLengthType() + 1) / 2;
|
varLen = (outField.getLengthType() + 1) / 2;
|
||||||
|
|||||||
@ -1382,4 +1382,15 @@ public class PayDetail implements Serializable {
|
|||||||
this.cardSettleData = cardSettleData;
|
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