Merge branch 'duel_settlement' of https://hub.utsmyanmar.com/Kyaw_Min_Khant/KBZ-POS into duel_settlement

This commit is contained in:
moon 2026-05-17 14:46:50 +06:30
commit a5ce7dc8e5
6 changed files with 75 additions and 5 deletions

View File

@ -154,6 +154,9 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
} else if(sharedViewModel.getIsCardAppBlock().getValue() != null && sharedViewModel.getIsCardAppBlock().getValue()) {
cardReadViewModel.setCheckCardAlertMsg("Magstripe not allowed!",false);
setupCardReadProcess(true);
} else if(sharedViewModel.getIsContactlessRestricted().getValue() != null && sharedViewModel.getIsContactlessRestricted().getValue()) {
cardReadViewModel.setCheckCardAlertMsg("Tap not allowed!",false);
setupCardReadProcess(true);
} else {
setupCardReadProcess(false);
}
@ -166,6 +169,7 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
sharedViewModel.setIsFallback(false);
sharedViewModel.setIsSeePhone(false);
sharedViewModel.setIsContactlessRestricted(false);
// cardReadViewModel.cancelCheckCard();
@ -262,7 +266,10 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
} else if(!SystemParamsOperation.getInstance().isNfcEnabled()) {
allType.add(CardSlotTypeEnum.ICC1);
allType.add(CardSlotTypeEnum.SWIPE);
} else {
} else if(sharedViewModel.getIsContactlessRestricted().getValue() != null && sharedViewModel.getIsContactlessRestricted().getValue()) {
allType.add(CardSlotTypeEnum.ICC1);
// allType.add(CardSlotTypeEnum.SWIPE);
} else {
allType.add(CardSlotTypeEnum.ICC1);
allType.add(CardSlotTypeEnum.RF);

View File

@ -232,6 +232,17 @@ public class EmvTransactionFragment extends DataBindingFragment {
case ON_NEXT_SCREEN:
navigateToRRNScreen();
break;
case INSERT_OR_MANUAL:
if(cardReadViewModel.cardTypeData.getValue() != null && cardReadViewModel.cardTypeData.getValue() == CardTypeX.NFC.value) {
isCardTaped("Please insert or type card",new CardDetectCallback() {
@Override
public void onComplete() {
sharedViewModel.setIsContactlessRestricted(true);
navigateToCheckCard();
}
});
}
break;
case READ_CARD_RETRY:
LogUtil.d(TAG,"Card type :"+cardReadViewModel.cardTypeData.getValue());
if(cardReadViewModel.cardTypeData.getValue()!= null && cardReadViewModel.cardTypeData.getValue() == CardTypeX.IC.value) {

View File

@ -172,6 +172,9 @@ public class EmvTransactionProcessViewModel extends EmvBaseViewModel implements
case EMV_TRY_AGAIN:
emvResultStatus.postValue(EmvResultStatus.READ_CARD_RETRY);
break;
case EMV_INSERT_OR_MANUAL:
emvResultStatus.postValue(EmvResultStatus.INSERT_OR_MANUAL);
break;
case EMV_CARD_APP_BLOCK:
emvResultStatus.postValue(EmvResultStatus.CARD_APP_BLOCKED);
break;

View File

@ -168,6 +168,8 @@ public class SharedViewModel extends ViewModel {
private SingleLiveEvent<Boolean> isFallback = new SingleLiveEvent<>();
private SingleLiveEvent<Boolean> isSeePhone = new SingleLiveEvent<>();
private SingleLiveEvent<Boolean> isContactlessRestricted = new SingleLiveEvent<>();
private SingleLiveEvent<Boolean> isCardAppBlock = new SingleLiveEvent<>();
private SingleLiveEvent<Boolean> _isCardDataExist = new SingleLiveEvent<>();
@ -246,6 +248,10 @@ public class SharedViewModel extends ViewModel {
public SingleLiveEvent<Boolean> getIsSeePhone() { return isSeePhone;}
public void setIsContactlessRestricted(boolean status) { isContactlessRestricted.setValue(status);}
public SingleLiveEvent<Boolean> getIsContactlessRestricted() {return isContactlessRestricted;}
public void setCardDataExist(boolean exist) { _isCardDataExist.setValue(exist);}
public SingleLiveEvent<Boolean> getCardDataExist() { return _isCardDataExist; }

View File

@ -31,5 +31,6 @@ public enum EmvResultStatus {
MPU_CARD,
SEE_PHONE,
OTHER_INTERFACE,
CARD_APP_BLOCKED
CARD_APP_BLOCKED,
INSERT_OR_MANUAL
}

View File

@ -159,6 +159,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
protected static final int EMV_ERROR = 12;
protected static final int EMV_TRY_AGAIN = 13;
protected static final int EMV_INSERT_OR_MANUAL = 24;
protected static final int EMV_CARD_APP_BLOCK = 23;
protected static final int EMV_CTLS_TRY_AGAIN = 13;
@ -179,6 +180,21 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
protected int mProcessStep;
protected int mAppSelect = 0;
private static final String[] RESTRICTED_BINS = {"624430",
"624431",
"624445",
"626220",
"623476",
"629214",
"623466",
"623433",
"62911028",
"62441900",
"62441901"
};
private boolean isMPU_UPIContactless = false;
private boolean mMPUContactlessConfigured = false;
private Looper mLooper = Looper.getMainLooper();
private final Handler mHandler = new Handler(mLooper) {
@ -215,7 +231,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
public void startProcess() {
isOfflinePinEntered = false;
mMPUContactlessConfigured = false;
isMPU_UPIContactless = false;
initData();
// Check if initialization was successful
@ -522,6 +538,16 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
++pinEnterCount;
}
private boolean isRestrictedBin(String cardNo) {
if (cardNo == null || cardNo.isEmpty()) return false;
for (String bin : RESTRICTED_BINS) {
if (cardNo.startsWith(bin)) {
LogUtil.d(TAG, "isRestrictedBin: matched BIN " + bin);
return true;
}
}
return false;
}
private OnEmvProcessListener2 emvProcessListener = new OnEmvProcessListener2() {
@Override
@ -590,7 +616,7 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
} else if (aidStr.contains("A000000003")) {
configPaywaveParameters();
} else if (aidStr.contains("A000000333")) {
configureQuickPassParamerter();
// configureQuickPassParamerter();
} else if (aidStr.contains("A000000541")) {
configPureContactlessParameter();
} else if (aidStr.contains("A000000065")) {
@ -653,6 +679,17 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
cardNo = cardInfoEntity.getCardNo();
if (mPayDetail.getCardType() == CardTypeX.NFC.value) {
if (isRestrictedBin(cardNo)) {
isMPU_UPIContactless = true;
LogUtil.d(TAG, "onConfirmCardNo: restricted BIN detected — " + cardNo);
emvHandler.onSetConfirmCardNoResponse(false);
emvHandler.emvProcessCancel();
}
}
if (mPayDetail.getCardType() == CardTypeX.NFC.value) {
cardNum.postValue(cardInfoEntity.getCardNo());
mPayDetail.setCardNo(cardInfoEntity.getCardNo());
@ -824,7 +861,12 @@ public abstract class EmvBaseViewModel extends BaseViewModel {
//
case SdkResult.Emv_Cancel:// Transaction Cancel
// //user cancel
mHandler.obtainMessage(EMV_ERROR, retCode, retCode, "Canceled").sendToTarget();
if(isMPU_UPIContactless) {
mHandler.sendEmptyMessage(EMV_INSERT_OR_MANUAL);
} else {
mHandler.obtainMessage(EMV_ERROR, retCode, retCode, "Canceled").sendToTarget();
}
break;
//
// case SdkResult.Emv_Offline_Declined: //