Compare commits

...

No commits in common. "main" and "mpu" have entirely different histories.
main ... mpu

391 changed files with 1346 additions and 460 deletions

File diff suppressed because one or more lines are too long

View File

@ -6,7 +6,7 @@
<GradleProjectSettings> <GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" /> <option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="temurin-17" /> <option name="gradleJvm" value="17 (2)" />
<option name="modules"> <option name="modules">
<set> <set>
<option value="$PROJECT_DIR$" /> <option value="$PROJECT_DIR$" />

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="temurin-17" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

View File

@ -14,8 +14,8 @@ android {
applicationId "com.utsmm.kbz" applicationId "com.utsmm.kbz"
minSdk 24 minSdk 24
targetSdk 33 targetSdk 33
versionCode 5 versionCode 7
versionName "1.05" versionName "1.07"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@ -196,6 +196,10 @@ dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0' androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0'
androidTestImplementation 'androidx.test:core:1.5.0'
androidTestImplementation 'androidx.test:runner:1.5.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
// Add Mockito dependency for mocking // Add Mockito dependency for mocking
testImplementation 'org.mockito:mockito-core:3.12.4' testImplementation 'org.mockito:mockito-core:3.12.4'
androidTestImplementation 'org.mockito:mockito-android:3.12.4' androidTestImplementation 'org.mockito:mockito-android:3.12.4'

BIN
app/release/app-release.apk Normal file

Binary file not shown.

View File

@ -11,8 +11,8 @@
"type": "SINGLE", "type": "SINGLE",
"filters": [], "filters": [],
"attributes": [], "attributes": [],
"versionCode": 5, "versionCode": 7,
"versionName": "1.05", "versionName": "1.07",
"outputFile": "app-release.apk" "outputFile": "app-release.apk"
} }
], ],

View File

@ -10,6 +10,29 @@ import org.junit.runner.RunWith;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import com.sunmi.pay.hardware.aidl.AidlConstants;
import com.utsmm.kbz.util.MockData;
import com.utsmm.kbz.util.TransactionUtil;
import com.utsmyanmar.checkxread.model.CardDataX;
import com.utsmyanmar.checkxread.util.CardTypeX;
import com.utsmyanmar.paylibs.Constant;
import com.utsmyanmar.paylibs.isobuilder.ISOMode;
import com.utsmyanmar.paylibs.isobuilder.builderx.ISOMsgX;
import com.utsmyanmar.paylibs.isobuilder.builderx.ISOVersion;
import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.model.enums.TransCVM;
import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.MessageType;
import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.enums.HostName;
import com.utsmyanmar.paylibs.utils.iso_utils.BitmapConfig;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
import com.utsmyanmar.paylibs.utils.params.Params;
import java.util.Locale;
/** /**
* Instrumented test, which will execute on an Android device. * Instrumented test, which will execute on an Android device.
* *
@ -23,4 +46,131 @@ public class ExampleInstrumentedTest {
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.utsmm.kbz", appContext.getPackageName()); assertEquals("com.utsmm.kbz", appContext.getPackageName());
} }
@Test
public void testVoidPacket() {
CardDataX cardDataX = MockData.getInstance().generateMPUCard();
TradeData tradeData = TransactionUtil.getInstance().initMPUTransaction(cardDataX, CardTypeX.IC);
String bitmap = BitmapConfig.MPU_NEW_VOID;
MessageType messageType = MessageType.FINANCIAL;
ISOMsgX isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1987, ISOMode.ONLY_HEADER, HostName.FINEXUS)
.build();
TradeData transTradeData = setUpRebuildTransactions(tradeData, TransactionsType.VOID, HostName.FINEXUS);
transTradeData.getPayDetail().setAmount(50000);
PayDetail transPayDetail = transTradeData.getPayDetail();
byte[] sendBytes;
try {
sendBytes = isoMsgX.buildISOPackets(transTradeData, bitmap, messageType);
System.out.println("Hex Str : "+ ByteUtil.bytes2HexStr(sendBytes));
} catch (Exception e) {
e.printStackTrace();
}
}
private TradeData setUpRebuildTransactions(TradeData tradeData, TransactionsType transactionsType, HostName hostName) {
LogUtil.d(Constant.TAG, "Starting Online Transaction--" + hostName + "--" + transactionsType);
TradeData newTrade = Params.newTrade(true);
PayDetail newPay = newTrade.getPayDetail();
PayDetail oldPay = tradeData.getPayDetail();
newPay.setCardType(100);
newPay.setPINCipher("");
newPay.setHostName(hostName.name);
newPay.setTransType(transactionsType.name);
newPay.setProcessCode(transactionsType.processCode);
newPay.setCardNo(oldPay.getCardNo());
newPay.setCardHolderName(oldPay.getCardHolderName());
newPay.setEXPDate(oldPay.getEXPDate());
newPay.setTradeDate(oldPay.getTradeDate());
newPay.setTradeTime(oldPay.getTradeTime());
newPay.setAmount(oldPay.getAmount());
newPay.setTransactionType(transactionsType.value);
newPay.setAccountType(oldPay.getAccountType());
newPay.setCardInfo(oldPay.getCardInfo());
newPay.setSettlementEnabled(SystemParamsOperation.getInstance().getSettlementStatus());
// added on Nov, 13 2024
newPay.setICC55(oldPay.getICC55());
if(newPay.getICC55() != null && !newPay.getICC55().isEmpty()) {
newPay.setAppLabel(oldPay.getAppLabel());
newPay.setAppName(oldPay.getAppName());
newPay.setTSI(oldPay.getTSI());
newPay.setAID(oldPay.getAID());
newPay.setArqC(oldPay.getArqC());
newPay.setTVR(oldPay.getTVR());
}
if(transactionsType != TransactionsType.PRE_AUTH_COMPLETE) {
newPay.setTradeDateTime(oldPay.getTradeDateTime());
}
if (transactionsType == TransactionsType.VOID || transactionsType == TransactionsType.REFUND) {
String field60;
if(hostName == HostName.BPC) {
field60 = String.format(Locale.getDefault(), "%010d00", oldPay.getAmount());
} else {
field60 = String.format(Locale.getDefault(), "%012d", oldPay.getAmount());
}
// String field60 = String.format(Locale.getDefault(), "%010d00", oldPay.getAmount());
newPay.setReferNo(oldPay.getReferNo());
newPay.setTransCVM(TransCVM.SIGNATURE);
newTrade.setField60(field60);
} else if (transactionsType == TransactionsType.PRE_AUTH_VOID) {
newPay.setCardType(oldPay.getCardType());
newPay.setCustomOrderNo(oldPay.getVoucherNo());
newPay.setReferNo(oldPay.getReferNo());
newPay.setCardInfo(oldPay.getCardInfo());
newPay.setPINCipher(oldPay.getPINCipher());
newPay.setTempKSN(oldPay.getTempKSN());
newPay.setTransCVM(TransCVM.SIGNATURE);
// for manual entry reversal which need de 35
} else if (transactionsType == TransactionsType.TIP_ADJUSTMENT ) {
newPay.setReferNo(oldPay.getReferNo());
newPay.setApprovalCode(oldPay.getApprovalCode());
} else if (transactionsType == TransactionsType.PRE_AUTH_COMPLETE) {
newPay.setCardType(oldPay.getCardType());
newPay.setCardInfo(oldPay.getCardInfo());
newPay.setPINCipher(oldPay.getPINCipher());
newPay.setReferNo(oldPay.getReferNo());
newPay.setTempKSN(oldPay.getTempKSN());
} else if (transactionsType == TransactionsType.PRE_AUTH_COMPLETE_VOID) {
newPay.setVoucherNo(oldPay.getVoucherNo());
newPay.setCustomOrderNo(oldPay.getVoucherNo());
newPay.setReferNo(oldPay.getReferNo());
newPay.setCardInfo(oldPay.getCardInfo());
/*
* new requirements */
newPay.setCardType(AidlConstants.CardType.IC.getValue());
newPay.setPINCipher("55");
newPay.setTransCVM(TransCVM.SIGNATURE);
}
if(oldPay.getAccountType().equals("MPU")){
// newPay.setIsFreeSign(true);
newPay.setTransCVM(TransCVM.SIGNATURE);
}
newTrade.setPayDetail(newPay);
return newTrade;
}
} }

View File

@ -46,8 +46,7 @@
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme.NoActionBar" android:theme="@style/AppTheme.NoActionBar">
>
<!-- android:manageSpaceActivity="com.utsmyanmar.upos.config.UTSManageSpaceActivity"--> <!-- android:manageSpaceActivity="com.utsmyanmar.upos.config.UTSManageSpaceActivity"-->
<!-- <activity--> <!-- <activity-->
<!-- android:screenOrientation="portrait"--> <!-- android:screenOrientation="portrait"-->

View File

@ -292,7 +292,7 @@ public class MainFragment extends DataBindingFragment {
private void updateButtonStatus() { private void updateButtonStatus() {
mainViewModel.settlementStatus.setValue(SystemParamsOperation.getInstance().getSettlementStatus()); mainViewModel.settlementStatus.setValue(SystemParamsOperation.getInstance().getSettlementStatus());
mainViewModel.kPayStatus.setValue(SystemParamsOperation.getInstance().getWavePayStatus()); mainViewModel.kPayStatus.setValue(SystemParamsOperation.getInstance().getQRPayStatus());
} }
private void setUpCarouselImages() { private void setUpCarouselImages() {

View File

@ -94,7 +94,7 @@ public class MainViewModel extends ViewModel {
settlementStatus.setValue(SystemParamsOperation.getInstance().getSettlementStatus()); settlementStatus.setValue(SystemParamsOperation.getInstance().getSettlementStatus());
kPayStatus.setValue(SystemParamsOperation.getInstance().getWavePayStatus()); kPayStatus.setValue(SystemParamsOperation.getInstance().getQRPayStatus());
disabledMsg.setValue(SystemParamsOperation.getInstance().getDisabledMsg()); disabledMsg.setValue(SystemParamsOperation.getInstance().getDisabledMsg());
} }

View File

@ -5,5 +5,6 @@ public enum CardTransactionType {
MPU, MPU,
EMV, EMV,
MAG, MAG,
FALLBACK FALLBACK,
MOCK
} }

View File

@ -106,11 +106,15 @@ public class CardWaitingFragment extends DataBindingFragment implements DataBind
public void onClickManualEntry() { public void onClickManualEntry() {
// showSingleInfoDialogAutoHide("Coming Soon!");
routeId = R.id.action_cardWaitingFragment_to_manualEntryFragment; routeId = R.id.action_cardWaitingFragment_to_manualEntryFragment;
safeNavigateToRouteId(); safeNavigateToRouteId();
} }
public void onClickTap() {
cardReadViewModel.setCardTransactionType(CardTransactionType.MOCK);
routeId = R.id.action_cardWaitingFragment_to_processingCardFragment;
safeNavigateToRouteId();
}
} }
@Override @Override

View File

@ -7,6 +7,7 @@ import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.utsmm.kbz.util.MockData;
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.checkxread.model.CardDataX; import com.utsmyanmar.checkxread.model.CardDataX;
@ -41,6 +42,8 @@ public class ProcessingCardFragment extends DataBindingFragment {
private TransProcessViewModel transProcessViewModel; private TransProcessViewModel transProcessViewModel;
private PinPadViewModel pinPadViewModel; private PinPadViewModel pinPadViewModel;
private EmvTransactionProcessViewModel emvTransactionViewModel; private EmvTransactionProcessViewModel emvTransactionViewModel;
private int routeId; private int routeId;
@Override @Override
@ -102,9 +105,24 @@ public class ProcessingCardFragment extends DataBindingFragment {
break; break;
case MAG: readMAGStripe(false,true); case MAG: readMAGStripe(false,true);
break; break;
case MOCK: mockMPUCard();
break;
} }
} }
private void mockMPUCard() {
LogUtil.d(TAG,"initialize mock card data...");
routeId = R.id.action_processingCardFragment_to_pinPadFragment;
transProcessViewModel.transType.postValue(sharedViewModel.transactionsType.getValue());
pinPadViewModel.transType.postValue(sharedViewModel.transactionsType.getValue());
CardDataX cardDataX = MockData.getInstance().generateMPUCard();
TradeData tradeData = TransactionUtil.getInstance().initMPUTransaction(cardDataX, CardTypeX.IC);
transProcessViewModel.setTradeData(tradeData);
pinPadViewModel.setTradeData(tradeData);
sharedViewModel.setCardDataExist(true);
safeNavigateToRouteId();
}
private void readMPUCard() { private void readMPUCard() {
cardReadViewModel.startReadXProcess(MPUXReadCard.getInstance(), new ReadCardResultX() { cardReadViewModel.startReadXProcess(MPUXReadCard.getInstance(), new ReadCardResultX() {

View File

@ -254,7 +254,6 @@ public class ProcessingFragment extends DataBindingFragment {
case FAIL: case FAIL:
case SUCCESS: case SUCCESS:
case OFFLINE_SUCCESS: case OFFLINE_SUCCESS:
LogUtil.d(TAG,"This was called!");
if(SystemParamsOperation.getInstance().getDemoStatus()) { if(SystemParamsOperation.getInstance().getDemoStatus()) {
delayFunctionCall(()->{ delayFunctionCall(()->{
// updateData(); // updateData();

View File

@ -42,12 +42,13 @@ import java.io.IOException;
import javax.inject.Inject; import javax.inject.Inject;
import dagger.hilt.android.AndroidEntryPoint;
import retrofit2.HttpException; import retrofit2.HttpException;
import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.LogUtil;
// Temporarily disabled Hilt // Temporarily disabled Hilt
// @AndroidEntryPoint @AndroidEntryPoint
public class TransactionResultFragment extends DataBindingFragment implements DataBindingFragment.BackPressCallback { public class TransactionResultFragment extends DataBindingFragment implements DataBindingFragment.BackPressCallback {
private static final String TAG = TransactionResultFragment.class.getSimpleName(); private static final String TAG = TransactionResultFragment.class.getSimpleName();

View File

@ -25,6 +25,8 @@ import java.util.HashSet;
import javax.inject.Inject; import javax.inject.Inject;
import io.reactivex.rxjava3.core.Single;
public class CardReadViewModel extends ViewModel { public class CardReadViewModel extends ViewModel {
@ -46,7 +48,7 @@ public class CardReadViewModel extends ViewModel {
public SingleLiveEvent<Integer> cardTypeData = new SingleLiveEvent<>(); public SingleLiveEvent<Integer> cardTypeData = new SingleLiveEvent<>();
public SingleLiveEvent<PayDetail> payDetail = new SingleLiveEvent<>(); public SingleLiveEvent<PayDetail> payDetail = new SingleLiveEvent<>();
public SingleLiveEvent<CardReadStatus> readStatus = new SingleLiveEvent<>();
public SingleLiveEvent<String> checkCardAlertMsg = new SingleLiveEvent<>(); public SingleLiveEvent<String> checkCardAlertMsg = new SingleLiveEvent<>();
@ -95,96 +97,6 @@ public class CardReadViewModel extends ViewModel {
checkCardAlertMsg.setValue(null); checkCardAlertMsg.setValue(null);
} }
// public void initCardReadProcess(int allType, int timeOutInSec, ReadCardResult readCardResult) {
// ReadCardProcess.getInstance().startReadCard(allType,"",timeOutInSec,false).onStartReadCardProcess(new CheckCardListener() {
// @Override
// public void onCheckCardSuccess(int cardType, MPUCardData mpuCardData, CardScheme cardScheme) {
//
// cardData.postValue(mpuCardData);
// cardSchemeData.postValue(cardScheme);
// cardTypeData.postValue(cardType);
// PayDetail payDetailData = new PayDetail();
// payDetailData.setCardNo(mpuCardData.getPan());
// payDetailData.setEXPDate(mpuCardData.getExp());
// payDetailData.setAccountType(cardScheme.name());
// payDetailData.setCardType(cardType);
// payDetailData.setCardHolderName(mpuCardData.getCardHolderName());
// CardInfo cardInfo = new CardInfo();
// MAGCardInfo magCardInfo = new MAGCardInfo();
// LogUtil.d(TAG,"track 2 : "+mpuCardData.getTrack2());
// magCardInfo.setTrack2Cipher(mpuCardData.getTrack2());
// cardInfo.setMAGCardInfo(magCardInfo);
// payDetailData.setCardInfo(cardInfo);
//
// payDetail.postValue(payDetailData);
//
// mainThreadHandler.post(readCardResult::onSuccess);
//// readCardResult.onSuccess();
//
// }
//
// @Override
// public void onCheckCardFail(int code, String message) {
//
// if(code == -2801) {
// mainThreadHandler.post(readCardResult::onCommunicationError);
//// readCardResult.onCommunicationError();
// } else {
// mainThreadHandler.post(() -> readCardResult.onError(code,message));
//// readCardResult.onError(code,message);
// }
//
// }
// });
// }
//
// public SingleLiveEvent<CardReadStatus> startReadProcess(int allType,int timeOutInSec){
//
// ReadCardProcess.getInstance().startReadCard(allType,"",timeOutInSec,false).onStartReadCardProcess(new CheckCardListener() {
// @Override
// public void onCheckCardSuccess(int cardType, MPUCardData mpuCardData, CardScheme cardScheme) {
// flag.postValue(true);
// cardData.postValue(mpuCardData);
// cardSchemeData.postValue(cardScheme);
// cardTypeData.postValue(cardType);
// PayDetail payDetailData = new PayDetail();
// payDetailData.setCardNo(mpuCardData.getPan());
// payDetailData.setEXPDate(mpuCardData.getExp());
// payDetailData.setAccountType(cardScheme.name());
// payDetailData.setCardType(cardType);
// payDetailData.setCardHolderName(mpuCardData.getCardHolderName());
// CardInfo cardInfo = new CardInfo();
// MAGCardInfo magCardInfo = new MAGCardInfo();
// LogUtil.d(TAG,"track 2 : "+mpuCardData.getTrack2());
// magCardInfo.setTrack2Cipher(mpuCardData.getTrack2());
// cardInfo.setMAGCardInfo(magCardInfo);
// payDetailData.setCardInfo(cardInfo);
//
// payDetail.postValue(payDetailData);
//
// readStatus.postValue(CardReadStatus.SUCCESS);
//
//
// }
//
// @Override
// public void onCheckCardFail(int code, String message) {
//
// readStatus.postValue(CardReadStatus.FAIL);
// // this action just need to do once because there's too many reason to get fail
// if(!oneTimeFlag){
// errorCode.postValue(code+":"+message);
// flag.postValue(false);
// cardSchemeData.postValue(CardScheme.UNK);
// oneTimeFlag = true;
// }
//
// }
// });
//
// return readStatus;
// }
public void resetOneTimeFlag(){ public void resetOneTimeFlag(){
oneTimeFlag = false; oneTimeFlag = false;
} }
@ -193,19 +105,5 @@ public class CardReadViewModel extends ViewModel {
NexGoSDK.getInstance().cancelCheckCard(); NexGoSDK.getInstance().cancelCheckCard();
} }
// public void checkCard(){
// int allType = AidlConstants.CardType.NFC.getValue() | AidlConstants.CardType.IC.getValue() | AidlConstants.CardType.MAGNETIC.getValue();
// ReadCardProcess.getInstance().startReadCard(allType,"",60,false).onStartReadCardProcess(new CheckCardListener() {
// @Override
// public void onCheckCardSuccess(int cardType, MPUCardData mpuCardData, CardScheme cardScheme) {
// System.out.println("Success");
// }
//
// @Override
// public void onCheckCardFail(int code, String message) {
//
// System.out.println("Failed");
// }
// });
// }
} }

View File

@ -492,9 +492,9 @@ public class EmvTransactionProcessViewModel extends EmvBaseViewModel implements
private void handleTransactionProcess() { private void handleTransactionProcess() {
String cardNo = mPayDetail.getCardNo(); String cardNo = mPayDetail.getCardNo();
if (cardNo == null || TextUtils.equals(cardNo, "")) { // if (cardNo == null || TextUtils.equals(cardNo, "")) {
getCardInfo(); getCardInfo();
} // }
getPayWaveData(); getPayWaveData();
getF055Data(); getF055Data();
if(transType.getValue() == TransactionsType.PRE_AUTH_COMPLETE || transType.getValue() == TransactionsType.PRE_AUTH_VOID || transType.getValue() == TransactionsType.REFUND ) { if(transType.getValue() == TransactionsType.PRE_AUTH_COMPLETE || transType.getValue() == TransactionsType.PRE_AUTH_VOID || transType.getValue() == TransactionsType.REFUND ) {

View File

@ -185,6 +185,15 @@ public class SharedViewModel extends ViewModel {
printReceiptButtons.postValue(value); printReceiptButtons.postValue(value);
} }
public void setTransactionsType(TransactionsType transactionsType) {
this.transactionsType.setValue(transactionsType);
}
public SingleLiveEvent<TransactionsType> getTransactionsType() {
return transactionsType;
}
public void setPrintReceiptMsg(String msg) { this.printReceiptMsg.setValue(msg);}
public void postPrintReceiptMsg(String msg) { this.printReceiptMsg.postValue(msg);} public void postPrintReceiptMsg(String msg) { this.printReceiptMsg.postValue(msg);}
public void setPrintStatus(PrintStatus printStatus) { this.printStatus.setValue(printStatus); } public void setPrintStatus(PrintStatus printStatus) { this.printStatus.setValue(printStatus); }
public void postPrintStatus(PrintStatus printStatus) { this.printStatus.postValue(printStatus); } public void postPrintStatus(PrintStatus printStatus) { this.printStatus.postValue(printStatus); }

View File

@ -135,7 +135,7 @@ public class DashboardTransFragment extends DataBindingFragment {
} else if (checkTid()) { } else if (checkTid()) {
showDeclineDialog("Please Download Config!"); showDeclineDialog("Please Download Config!");
} else { } else {
sharedViewModel.transactionsType.setValue(TransactionsType.VOID); sharedViewModel.setTransactionsType(TransactionsType.VOID);
// sharedViewModel.transMenu.postValue(TransMenu.TRANSACTIONS); // sharedViewModel.transMenu.postValue(TransMenu.TRANSACTIONS);
sharedViewModel.setTransMenu(TransMenu.TRANSACTIONS); sharedViewModel.setTransMenu(TransMenu.TRANSACTIONS);
@ -147,16 +147,15 @@ public class DashboardTransFragment extends DataBindingFragment {
public void onClickSettlement() { public void onClickSettlement() {
sharedViewModel.settlementType.setValue(SettlementType.NORMAL); sharedViewModel.settlementType.setValue(SettlementType.NORMAL);
sharedViewModel.transactionsType.setValue(TransactionsType.SETTLEMENT);
sharedViewModel.setTransMenu(TransMenu.SETTLEMENT); sharedViewModel.setTransMenu(TransMenu.SETTLEMENT);
sharedViewModel.setTransactionsType(TransactionsType.SETTLEMENT);
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment; routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
safeRouteTo(currentId,routeId,hostId); safeRouteTo(currentId,routeId,hostId);
} }
public void onClickRefund() { public void onClickRefund() {
sharedViewModel.transactionsType.setValue(TransactionsType.REFUND); sharedViewModel.setTransactionsType(TransactionsType.REFUND);
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment; routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
safeRouteTo(currentId,routeId,hostId); safeRouteTo(currentId,routeId,hostId);
} }
@ -167,8 +166,7 @@ public class DashboardTransFragment extends DataBindingFragment {
} else if (checkTid()) { } else if (checkTid()) {
showDeclineDialog("Please Download Config!"); showDeclineDialog("Please Download Config!");
} else { } else {
sharedViewModel.transactionsType.setValue(TransactionsType.PRE_AUTH_SALE); sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_SALE);
routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment; routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment;
safeRouteTo(currentId,routeId,hostId); safeRouteTo(currentId,routeId,hostId);
} }
@ -176,7 +174,7 @@ public class DashboardTransFragment extends DataBindingFragment {
} }
public void onClickPreAuthCancel () { public void onClickPreAuthCancel () {
sharedViewModel.transactionsType.setValue(TransactionsType.PRE_AUTH_VOID); sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_VOID);
sharedViewModel.setTransMenu(TransMenu.PRE_AUTH_FULL_VOID); sharedViewModel.setTransMenu(TransMenu.PRE_AUTH_FULL_VOID);
sharedViewModel.amount.postValue(null); sharedViewModel.amount.postValue(null);
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment; routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
@ -185,14 +183,14 @@ public class DashboardTransFragment extends DataBindingFragment {
} }
public void onClickPreAuthComp () { public void onClickPreAuthComp () {
sharedViewModel.transactionsType.setValue(TransactionsType.PRE_AUTH_COMPLETE); sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_COMPLETE);
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment; routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
safeRouteTo(currentId,routeId,hostId); safeRouteTo(currentId,routeId,hostId);
} }
public void onClickPreAuthCompCancel () { public void onClickPreAuthCompCancel () {
sharedViewModel.transactionsType.setValue(TransactionsType.PRE_AUTH_COMPLETE_VOID); sharedViewModel.setTransactionsType(TransactionsType.PRE_AUTH_COMPLETE_VOID);
routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment; routeId = R.id.action_dashboardTransFragment_to_inputPasswordFragment;
safeRouteTo(currentId,routeId,hostId); safeRouteTo(currentId,routeId,hostId);
@ -200,7 +198,8 @@ public class DashboardTransFragment extends DataBindingFragment {
public void onClickCashAdvance() { public void onClickCashAdvance() {
sharedViewModel.transactionsType.setValue(TransactionsType.CASH_OUT); sharedViewModel.setTransactionsType(TransactionsType.CASH_OUT);
sharedViewModel.setTransMenu(TransMenu.CASH_OUT);
routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment; routeId = R.id.action_dashboardTransFragment_to_inputAmountFragment;
safeRouteTo(currentId,routeId,hostId); safeRouteTo(currentId,routeId,hostId);

View File

@ -36,6 +36,7 @@ import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.system.SingleLiveEvent; import com.utsmyanmar.paylibs.system.SingleLiveEvent;
import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsSettings;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.HashMap; import java.util.HashMap;
@ -52,7 +53,11 @@ public class KPayViewModel extends ViewModel {
private final Repository repository; private final Repository repository;
private final String appKey = "UTSMMuat@2025"; private final String appKey = SystemParamsOperation.getInstance().getAppKey();
// private final String appKey = "UTSMMuat@2025";
private final String appId = SystemParamsOperation.getInstance().getAppId();
// private final String appId = "kp9b0794b349ae85b00c51e0677484c7";
private final ExecutorService executor = Executors.newSingleThreadExecutor(); private final ExecutorService executor = Executors.newSingleThreadExecutor();
private final Handler mainHandler = new Handler(Looper.getMainLooper()); private final Handler mainHandler = new Handler(Looper.getMainLooper());
@ -114,7 +119,7 @@ public class KPayViewModel extends ViewModel {
bizContent.put("refund_request_no", refundOrderId); bizContent.put("refund_request_no", refundOrderId);
bizContent.put("merch_order_id", origOrderId); bizContent.put("merch_order_id", origOrderId);
bizContent.put("merch_code", mid); bizContent.put("merch_code", mid);
bizContent.put("appid", "kp9b0794b349ae85b00c51e0677484c7"); bizContent.put("appid", appId);
if(!refundAmount.equals("0")) { if(!refundAmount.equals("0")) {
bizContent.put("refund_amount", refundAmount); bizContent.put("refund_amount", refundAmount);
} }
@ -138,7 +143,7 @@ public class KPayViewModel extends ViewModel {
KPayRefund.RefundRequest.RequestBody.BizContent biz = KPayRefund.RefundRequest.RequestBody.BizContent biz =
new KPayRefund.RefundRequest.RequestBody.BizContent( new KPayRefund.RefundRequest.RequestBody.BizContent(
"kp9b0794b349ae85b00c51e0677484c7", appId,
mid, mid,
origOrderId, origOrderId,
refundAmount, // This can be null for original refunds refundAmount, // This can be null for original refunds
@ -160,7 +165,7 @@ public class KPayViewModel extends ViewModel {
} else { } else {
KPayRefund.RefundRequest.RequestBody.BizContent biz = KPayRefund.RefundRequest.RequestBody.BizContent biz =
new KPayRefund.RefundRequest.RequestBody.BizContent( new KPayRefund.RefundRequest.RequestBody.BizContent(
"kp9b0794b349ae85b00c51e0677484c7", appId,
mid, mid,
origOrderId, origOrderId,
refundOrderId, refundOrderId,
@ -195,7 +200,7 @@ public class KPayViewModel extends ViewModel {
Map<String, Object> bizContent = new HashMap<>(); Map<String, Object> bizContent = new HashMap<>();
bizContent.put("merch_order_id", merchOrderId); bizContent.put("merch_order_id", merchOrderId);
bizContent.put("merch_code", mid); bizContent.put("merch_code", mid);
bizContent.put("appid", "kp9b0794b349ae85b00c51e0677484c7"); bizContent.put("appid", appId);
bizContent.put("trade_type", "PAY_BY_QRCODE"); bizContent.put("trade_type", "PAY_BY_QRCODE");
bizContent.put("total_amount", amount); bizContent.put("total_amount", amount);
bizContent.put("title", "testing"); bizContent.put("title", "testing");
@ -216,7 +221,7 @@ public class KPayViewModel extends ViewModel {
String sign = Sign.INSTANCE.generateSign(requestMap, appKey); String sign = Sign.INSTANCE.generateSign(requestMap, appKey);
KPayQRRequest.QrRequest.RequestBody.BizContent biz = new KPayQRRequest.QrRequest.RequestBody.BizContent( KPayQRRequest.QrRequest.RequestBody.BizContent biz = new KPayQRRequest.QrRequest.RequestBody.BizContent(
"kp9b0794b349ae85b00c51e0677484c7", appId,
mid, mid,
merchOrderId, merchOrderId,
"PAY_BY_QRCODE", "PAY_BY_QRCODE",
@ -252,7 +257,7 @@ public class KPayViewModel extends ViewModel {
Map<String, Object> bizContentMap = new HashMap<>(); Map<String, Object> bizContentMap = new HashMap<>();
bizContentMap.put("merch_order_id", merchOrderId); bizContentMap.put("merch_order_id", merchOrderId);
bizContentMap.put("merch_code", mid); bizContentMap.put("merch_code", mid);
bizContentMap.put("appid", "kp9b0794b349ae85b00c51e0677484c7"); bizContentMap.put("appid", appId);
Map<String, Object> requestMap = new HashMap<>(); Map<String, Object> requestMap = new HashMap<>();
requestMap.put("timestamp", currentTime); requestMap.put("timestamp", currentTime);
@ -264,7 +269,7 @@ public class KPayViewModel extends ViewModel {
String sign = Sign.INSTANCE.generateSign(requestMap, appKey); String sign = Sign.INSTANCE.generateSign(requestMap, appKey);
KPayQRQueryRequest.QRQueryRequest.Request.BizContent bizContent = new KPayQRQueryRequest.QRQueryRequest.Request.BizContent( KPayQRQueryRequest.QRQueryRequest.Request.BizContent bizContent = new KPayQRQueryRequest.QRQueryRequest.Request.BizContent(
"kp9b0794b349ae85b00c51e0677484c7", appId,
mid, mid,
merchOrderId merchOrderId
); );

View File

@ -13,6 +13,7 @@ import com.nexgo.oaf.apiv3.SdkResult;
import com.nexgo.oaf.apiv3.device.pinpad.AlgorithmModeEnum; import com.nexgo.oaf.apiv3.device.pinpad.AlgorithmModeEnum;
import com.nexgo.oaf.apiv3.device.pinpad.OnPinPadInputListener; import com.nexgo.oaf.apiv3.device.pinpad.OnPinPadInputListener;
import com.nexgo.oaf.apiv3.device.pinpad.PinAlgorithmModeEnum; import com.nexgo.oaf.apiv3.device.pinpad.PinAlgorithmModeEnum;
import com.nexgo.oaf.apiv3.device.pinpad.PinKeyboardModeEnum;
import com.nexgo.oaf.apiv3.device.pinpad.PinKeyboardViewModeEnum; import com.nexgo.oaf.apiv3.device.pinpad.PinKeyboardViewModeEnum;
import com.nexgo.oaf.apiv3.device.pinpad.PinPad; import com.nexgo.oaf.apiv3.device.pinpad.PinPad;
import com.nexgo.oaf.apiv3.device.pinpad.PinPadKeyCode; import com.nexgo.oaf.apiv3.device.pinpad.PinPadKeyCode;
@ -119,7 +120,12 @@ public class PinPadViewModel extends ViewModel {
case ON_CONFIRM_CLICK: case ON_CONFIRM_CLICK:
LogUtil.d(TAG, "ON CLICK CONFIRM"); LogUtil.d(TAG, "ON CLICK CONFIRM");
// increasedKSN(); // increasedKSN();
pinStatus.postValue(PinPadStatus.ON_CONFIRM); if(transType.getValue() == TransactionsType.PRE_AUTH_COMPLETE || transType.getValue() == TransactionsType.PRE_AUTH_VOID || transType.getValue() == TransactionsType.REFUND ) {
pinStatus.postValue(PinPadStatus.ON_NEXT_SCREEN);
} else {
pinStatus.postValue(PinPadStatus.ON_CONFIRM);
}
break; break;
case ON_CANCEL_CLICK: case ON_CANCEL_CLICK:
LogUtil.d(TAG, "ON CLICK CANCEL"); LogUtil.d(TAG, "ON CLICK CANCEL");
@ -317,6 +323,8 @@ public class PinPadViewModel extends ViewModel {
r.bottom = customPinPadKeyboard.getKey_ok().getHeight() + r.top; r.bottom = customPinPadKeyboard.getKey_ok().getHeight() + r.top;
pinpadLayout.setKeyConfirm(r); pinpadLayout.setKeyConfirm(r);
pinPad.setPinKeyboardMode(PinKeyboardModeEnum.FIXED);
byte[] number = pinPad.setPinpadLayout(pinpadLayout); byte[] number = pinPad.setPinpadLayout(pinpadLayout);
if(number != null) { if(number != null) {
@ -331,6 +339,8 @@ public class PinPadViewModel extends ViewModel {
byte[] panBytes = pan.substring(length - 13).getBytes(StandardCharsets.US_ASCII); byte[] panBytes = pan.substring(length - 13).getBytes(StandardCharsets.US_ASCII);
// byte[] panBytes = pan.substring(length - 13, length - 1).getBytes(StandardCharsets.US_ASCII); // byte[] panBytes = pan.substring(length - 13, length - 1).getBytes(StandardCharsets.US_ASCII);
pinPad.setPinKeyboardViewMode(PinKeyboardViewModeEnum.DEFAULT); pinPad.setPinKeyboardViewMode(PinKeyboardViewModeEnum.DEFAULT);
pinPad.setPinKeyboardMode(PinKeyboardModeEnum.FIXED);
// pinPad.setAlgorithmMode(AlgorithmModeEnum.DES); // pinPad.setAlgorithmMode(AlgorithmModeEnum.DES);

View File

@ -8,6 +8,9 @@ import com.utsmyanmar.paylibs.model.PayDetail;
import javax.inject.Inject; import javax.inject.Inject;
import dagger.hilt.android.lifecycle.HiltViewModel;
@HiltViewModel
public class PreAuthVoidViewModel extends ViewModel { public class PreAuthVoidViewModel extends ViewModel {
private Repository repository; private Repository repository;

View File

@ -1,6 +1,7 @@
package com.utsmm.kbz.util; package com.utsmm.kbz.util;
import com.sunmi.pay.hardware.aidlv2.AidlConstantsV2; import com.sunmi.pay.hardware.aidlv2.AidlConstantsV2;
import com.utsmyanmar.checkxread.model.CardDataX;
import com.utsmyanmar.paylibs.model.CardInfo; import com.utsmyanmar.paylibs.model.CardInfo;
import com.utsmyanmar.paylibs.model.ICCardInfo; import com.utsmyanmar.paylibs.model.ICCardInfo;
import com.utsmyanmar.paylibs.model.MAGCardInfo; import com.utsmyanmar.paylibs.model.MAGCardInfo;
@ -42,15 +43,42 @@ public class MockData {
// .cardScheme("VISA") // .cardScheme("VISA")
// .cardHolderName("U AYE") // .cardHolderName("U AYE")
// .iccData("5F21BLAHBLAH") // .iccData("5F21BLAHBLAH")
// .build();
// mockCardData = new MockCardData.Builder()
// .cardNo("9503051034047056")
// .expDate("0230")
// .cardScheme("MPU")
// .cardHolderName("KBZ Debit")
// .iccData("9503051034047056=30021015930000000000")
// .build();
// mockCardData = new MockCardData.Builder()
// .cardNo("9505050161133125")
// .expDate("0127")
// .cardScheme("MPU")
// .cardHolderName("KBZ Credit")
// .iccData("9505050161133125=27011017250000000000")
// .build(); // .build();
mockCardData = new MockCardData.Builder() mockCardData = new MockCardData.Builder()
.cardNo("9503190006079422") .cardNo("9503712156912514")
.expDate("0725") .expDate("1229")
.cardScheme("MPU") .cardScheme("MPU")
.cardHolderName("YOMA VALUED CUSTOMER") .cardHolderName("Htin Kyaw Win")
.iccData("9503712156912514=29121010000000000000")
.build(); .build();
// mockCardData = new MockCardData.Builder()
// .cardNo("9503742975107251")
// .expDate("0629")
// .cardScheme("MPU")
// .cardHolderName("Bank Q")
// .iccData("9503742975107251=22081010000000000000")
// .build();
// mockCardData = new MockCardData.Builder() // mockCardData = new MockCardData.Builder()
// .phoneNo("9794452506") // .phoneNo("9794452506")
// .expDate("0425") // .expDate("0425")
@ -74,6 +102,15 @@ public class MockData {
return String.valueOf(randomNumber); return String.valueOf(randomNumber);
} }
public CardDataX generateMPUCard() {
CardDataX cardDataX = new CardDataX();
cardDataX.setPan(mockCardData.getCardNo());
cardDataX.setExp(mockCardData.getExpDate());
cardDataX.setCardHolderName(mockCardData.getCardHolderName());
cardDataX.setTrack2(mockCardData.getIccData());
return cardDataX;
}
public TradeData generateMockDataWithTime(TransactionsType transType,int cardInputType,String transDate,String transTime) { public TradeData generateMockDataWithTime(TransactionsType transType,int cardInputType,String transDate,String transTime) {
String strDate = SystemDateTime.getMMDD(); String strDate = SystemDateTime.getMMDD();
String strTime = SystemDateTime.getHHmmss(); String strTime = SystemDateTime.getHHmmss();

View File

@ -10,6 +10,7 @@ import com.utsmyanmar.baselib.network.model.sirius.SiriusMerchant;
import com.utsmyanmar.baselib.network.model.sirius.SiriusProperty; import com.utsmyanmar.baselib.network.model.sirius.SiriusProperty;
import com.utsmyanmar.baselib.network.model.sirius.SiriusResponse; import com.utsmyanmar.baselib.network.model.sirius.SiriusResponse;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsSettings;
import com.utsmyanmar.paylibs.utils.enums.CurrencyType; import com.utsmyanmar.paylibs.utils.enums.CurrencyType;
import com.utsmm.kbz.BuildConfig; import com.utsmm.kbz.BuildConfig;
@ -170,7 +171,7 @@ public class TMSSetupsImpl implements TMSSetups{
for (SiriusHost siriusHost: siriusHosts) { for (SiriusHost siriusHost: siriusHosts) {
if( siriusHost.getName().toLowerCase().contains("mmqr") || siriusHost.getName().toLowerCase().contains("kbzpay") || siriusHost.getDescription().toLowerCase().contains("mmqr") || siriusHost.getDescription().toLowerCase().contains("qr")) { if( siriusHost.getName().toLowerCase().contains("mmqr") || siriusHost.getName().toLowerCase().contains("kbzpay") || siriusHost.getName().toLowerCase().contains("mmqr") || siriusHost.getName().toLowerCase().contains("qr")) {
SystemParamsOperation.getInstance().setSecHostName(siriusHost.getName()); SystemParamsOperation.getInstance().setSecHostName(siriusHost.getName());
SystemParamsOperation.getInstance().setSecHostTerminalId(siriusHost.getTid()); SystemParamsOperation.getInstance().setSecHostTerminalId(siriusHost.getTid());
@ -412,15 +413,15 @@ public class TMSSetupsImpl implements TMSSetups{
} else if (TextUtils.equals(name,"ssl_enable")) { } else if (TextUtils.equals(name,"ssl_enable")) {
SystemParamsOperation.getInstance().setSslSwitchStatus(parseBoolean(data)); SystemParamsOperation.getInstance().setSslSwitchStatus(parseBoolean(data));
} else if (TextUtils.equals(name,"wave_pay_inquiry_status_enable")) { } else if (TextUtils.equals(name,"qrpay_inquiry_status_enable")) {
SystemParamsOperation.getInstance().setWavePayInquiryStatus(parseBoolean(data)); SystemParamsOperation.getInstance().setQRPayInquiryStatus(parseBoolean(data));
} else if (TextUtils.equals(name,"tips_adjustment_enable")) { } else if (TextUtils.equals(name,"tips_adjustment_enable")) {
SystemParamsOperation.getInstance().setTipsAdjustmentStatus(parseBoolean(data)); SystemParamsOperation.getInstance().setTipsAdjustmentStatus(parseBoolean(data));
} else if (TextUtils.equals(name,"wave_enable")) { } else if (TextUtils.equals(name,"qrpay_enable")) {
SystemParamsOperation.getInstance().setWavePayStatus(parseBoolean(data)); SystemParamsOperation.getInstance().setQRPayStatus(parseBoolean(data));
} else if (TextUtils.equals(name,"print_iso_enable")) { } else if (TextUtils.equals(name,"print_iso_enable")) {
SystemParamsOperation.getInstance().setPrintISOStatus(parseBoolean(data)); SystemParamsOperation.getInstance().setPrintISOStatus(parseBoolean(data));
@ -582,11 +583,14 @@ public class TMSSetupsImpl implements TMSSetups{
} }
} else if (TextUtils.equals(name,"speedup_contactless_enable")) { } else if (TextUtils.equals(name,"speedup_contactless_enable")) {
SystemParamsOperation.getInstance().setSpeedUpContactless(parseBoolean(data)); SystemParamsOperation.getInstance().setSpeedUpContactless(parseBoolean(data));
} } else if (TextUtils.equals(name,"manual_entry_pin_enable")) {
else if (TextUtils.equals(name,"manual_entry_pin_enable")) {
SystemParamsOperation.getInstance().setManualEntryPinEnable(parseBoolean(data)); SystemParamsOperation.getInstance().setManualEntryPinEnable(parseBoolean(data));
} else if (TextUtils.equals(name,"decimal_enable")) { } else if (TextUtils.equals(name,"decimal_enable")) {
SystemParamsOperation.getInstance().setDecimalEnable(parseBoolean(data)); SystemParamsOperation.getInstance().setDecimalEnable(parseBoolean(data));
} else if (TextUtils.equals(name,"app_key")) {
SystemParamsOperation.getInstance().setAppKey(data);
} else if (TextUtils.equals(name,"app_id")) {
SystemParamsOperation.getInstance().setAppId(data);
} }
} }
@ -684,7 +688,7 @@ public class TMSSetupsImpl implements TMSSetups{
return value == 1; return value == 1;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return false; return Boolean.parseBoolean(data);
} }
} }
} }

View File

@ -147,7 +147,8 @@ public class TMSUtil {
siriusRequest.setApplicationVersion(BuildConfig.VERSION_NAME); siriusRequest.setApplicationVersion(BuildConfig.VERSION_NAME);
siriusRequest.setCurrentNetwork(getNetworkType(context)); siriusRequest.setCurrentNetwork(getNetworkType(context));
siriusRequest.setLastTransaction(lastTransName); siriusRequest.setLastTransaction(lastTransName);
siriusRequest.setLastTranTime(lastTransTime); siriusRequest.setLastTranTime(Long.parseLong(lastTransTime));
siriusRequest.setValue("YourValueHere");
return siriusRequest; return siriusRequest;
} }
@ -206,7 +207,7 @@ public class TMSUtil {
voidStatus = SystemParamsOperation.getInstance().getVoidStatus(); voidStatus = SystemParamsOperation.getInstance().getVoidStatus();
cashAdvanceStatus = SystemParamsOperation.getInstance().getCashAdvanceStatus(); cashAdvanceStatus = SystemParamsOperation.getInstance().getCashAdvanceStatus();
refundStatus = SystemParamsOperation.getInstance().getRefundStatus(); refundStatus = SystemParamsOperation.getInstance().getRefundStatus();
wavePayInquiryStatus = SystemParamsOperation.getInstance().getWavePayInquiryStatus(); wavePayInquiryStatus = SystemParamsOperation.getInstance().getQRPayInquiryStatus();
tipAdjustmentStatus = SystemParamsOperation.getInstance().getTipsAdjustmentStatus(); tipAdjustmentStatus = SystemParamsOperation.getInstance().getTipsAdjustmentStatus();
settlementStatus = SystemParamsOperation.getInstance().getSettlementStatus(); settlementStatus = SystemParamsOperation.getInstance().getSettlementStatus();

View File

@ -149,6 +149,7 @@
android:layout_weight="1" android:layout_weight="1"
app:cardCornerRadius="12dp" app:cardCornerRadius="12dp"
app:cardElevation="2dp" app:cardElevation="2dp"
android:onClick="@{()->click.onClickTap()}"
android:backgroundTint="#fff" android:backgroundTint="#fff"
android:foreground="?android:attr/selectableItemBackground" android:foreground="?android:attr/selectableItemBackground"
android:focusable="true" android:focusable="true"

View File

@ -32,21 +32,21 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:padding="16dp" android:padding="10dp"
android:paddingTop="24dp" android:paddingTop="14dp"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<!-- Trace Number Icon --> <!-- Trace Number Icon -->
<ImageView <ImageView
android:layout_width="48dp" android:layout_width="36dp"
android:layout_height="48dp" android:layout_height="36dp"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginBottom="12dp" android:layout_marginBottom="8dp"
android:src="@drawable/ic_txn_history" android:src="@drawable/ic_txn_history"
app:tint="@color/colorPrimary" app:tint="@color/colorPrimary"
android:alpha="0.9" android:alpha="0.88"
android:padding="8dp" android:padding="6dp"
android:background="@drawable/bg_oval" /> android:background="@drawable/bg_oval" />
<!-- Compact Title --> <!-- Compact Title -->
@ -56,10 +56,10 @@
android:text="@string/enter_trace_text" android:text="@string/enter_trace_text"
android:textAlignment="center" android:textAlignment="center"
android:textColor="@color/colorPrimary" android:textColor="@color/colorPrimary"
android:textSize="22sp" android:textSize="17sp"
android:textStyle="bold" android:textStyle="bold"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
android:layout_marginBottom="4dp" /> android:layout_marginBottom="2dp" />
<!-- Compact Subtitle --> <!-- Compact Subtitle -->
<TextView <TextView
@ -68,18 +68,18 @@
android:text="Enter the transaction trace number" android:text="Enter the transaction trace number"
android:textAlignment="center" android:textAlignment="center"
android:textColor="@color/colorPrimary" android:textColor="@color/colorPrimary"
android:textSize="14sp" android:textSize="12sp"
android:alpha="0.75" android:alpha="0.7"
android:fontFamily="sans-serif" android:fontFamily="sans-serif"
android:layout_marginBottom="16dp" /> android:layout_marginBottom="10dp" />
<!-- Compact Trace Number Display Card --> <!-- Compact Trace Number Display Card -->
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/traceCard" android:id="@+id/traceCard"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="70dp" android:layout_height="48dp"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="4dp"
app:cardCornerRadius="16dp" app:cardCornerRadius="12dp"
app:cardElevation="0dp" app:cardElevation="0dp"
app:cardBackgroundColor="@color/white"> app:cardBackgroundColor="@color/white">
@ -87,11 +87,11 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_margin="2dp" android:layout_margin="1dp"
android:background="@drawable/bg_edittext_primary_border" android:background="@drawable/bg_edittext_primary_border"
android:orientation="horizontal" android:orientation="horizontal"
android:gravity="center" android:gravity="center"
android:padding="16dp"> android:padding="8dp">
<!-- Trace number display --> <!-- Trace number display -->
<TextView <TextView
@ -102,22 +102,22 @@
android:gravity="center" android:gravity="center"
android:text="@{inputTraceViewModel.invoiceNo}" android:text="@{inputTraceViewModel.invoiceNo}"
android:textColor="@color/colorPrimary" android:textColor="@color/colorPrimary"
android:textSize="28sp" android:textSize="20sp"
android:textStyle="bold" android:textStyle="bold"
android:letterSpacing="0.1" android:letterSpacing="0.07"
android:fontFamily="monospace" android:fontFamily="monospace"
android:hint="000000" android:hint="000000"
android:textColorHint="@color/colorPrimary" android:textColorHint="@color/colorPrimary"
android:alpha="0.6" android:alpha="0.5"
tools:text="123456" /> tools:text="123456" />
<!-- Transaction indicator --> <!-- Transaction indicator -->
<View <View
android:layout_width="6dp" android:layout_width="5dp"
android:layout_height="6dp" android:layout_height="5dp"
android:background="@drawable/bg_oval" android:background="@drawable/bg_oval"
android:backgroundTint="@color/colorPrimary" android:backgroundTint="@color/colorPrimary"
android:alpha="0.6" /> android:alpha="0.5" />
</LinearLayout> </LinearLayout>
@ -125,14 +125,14 @@
</LinearLayout> </LinearLayout>
<!-- Number Keyboard - guaranteed space --> <!-- Number Keyboard - guaranteed space, more compact -->
<com.utsmyanmar.baselib.ui.NumberKeyboard <com.utsmyanmar.baselib.ui.NumberKeyboard
android:id="@+id/passwordKeyboard" android:id="@+id/passwordKeyboard"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="8dp"
android:layout_marginTop="8dp" android:layout_marginTop="4dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="4dp"
app:KeyClickCallback="@{inputTraceViewModel.onKeyClick}" app:KeyClickCallback="@{inputTraceViewModel.onKeyClick}"
app:layout_constraintBottom_toTopOf="@+id/actionButtonsContainer" app:layout_constraintBottom_toTopOf="@+id/actionButtonsContainer"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@ -146,8 +146,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
android:padding="16dp" android:padding="8dp"
android:paddingBottom="24dp" android:paddingBottom="12dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"> app:layout_constraintStart_toStartOf="parent">
@ -155,34 +155,34 @@
<Button <Button
android:id="@+id/btnCancel" android:id="@+id/btnCancel"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="52dp" android:layout_height="42dp"
android:layout_weight="1" android:layout_weight="1"
android:layout_marginEnd="8dp" android:layout_marginEnd="6dp"
android:text="@string/layout_cancel" android:text="@string/layout_cancel"
android:textColor="@color/colorPrimary" android:textColor="@color/colorPrimary"
android:textSize="15sp" android:textSize="12sp"
android:textStyle="bold" android:textStyle="bold"
android:background="@drawable/bg_rounded_btn_cancel_cv" android:background="@drawable/bg_rounded_btn_cancel_cv"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
android:onClick="@{()->click.onCancel()}" android:onClick="@{()->click.onCancel()}"
android:elevation="2dp" android:elevation="1dp"
android:textAllCaps="false" /> android:textAllCaps="false" />
<!-- Confirm Button --> <!-- Confirm Button -->
<Button <Button
android:id="@+id/btnConfirm" android:id="@+id/btnConfirm"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="52dp" android:layout_height="42dp"
android:layout_weight="1" android:layout_weight="1"
android:layout_marginStart="8dp" android:layout_marginStart="6dp"
android:text="@string/layout_confirm" android:text="@string/layout_confirm"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="15sp" android:textSize="12sp"
android:textStyle="bold" android:textStyle="bold"
android:background="@drawable/bg_rounded_btn_cv" android:background="@drawable/bg_rounded_btn_cv"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
android:onClick="@{()->click.onConfirm()}" android:onClick="@{()->click.onConfirm()}"
android:elevation="8dp" android:elevation="3dp"
android:textAllCaps="false" /> android:textAllCaps="false" />
</LinearLayout> </LinearLayout>

View File

@ -186,6 +186,12 @@
app:popUpToInclusive="true" app:popUpToInclusive="true"
android:id="@+id/action_cardWaitingFragment_to_nav_main" android:id="@+id/action_cardWaitingFragment_to_nav_main"
app:destination="@id/nav_main" /> app:destination="@id/nav_main" />
<action
android:id="@+id/action_cardWaitingFragment_to_pinPadFragment"
app:launchSingleTop="true"
app:popUpTo="@+id/cardWaitingFragment"
app:popUpToInclusive="true"
app:destination="@id/pinPadFragment" />
</fragment> </fragment>
<fragment <fragment
tools:layout="@layout/fragment_emv_input_pin" tools:layout="@layout/fragment_emv_input_pin"

View File

@ -6,5 +6,6 @@
<domain includeSubdomains="true">128.199.170.203</domain> <domain includeSubdomains="true">128.199.170.203</domain>
<domain includeSubdomains="true">152.42.199.193</domain> <domain includeSubdomains="true">152.42.199.193</domain>
<domain includeSubdomains="true">api.kbzpay.com</domain> <domain includeSubdomains="true">api.kbzpay.com</domain>
<domain includeSubdomains="true">sirius-nest.utsmyanmar.com</domain>
</domain-config> </domain-config>
</network-security-config> </network-security-config>

View File

@ -14,4 +14,7 @@ public class ExampleUnitTest {
public void addition_isCorrect() { public void addition_isCorrect() {
assertEquals(4, 2 + 2); assertEquals(4, 2 + 2);
} }
} }

0
baselib/src/main/assets/lottie-search-files.json Normal file → Executable file
View File

0
baselib/src/main/assets/lottie_decline.json Normal file → Executable file
View File

0
baselib/src/main/assets/lottie_info.json Normal file → Executable file
View File

0
baselib/src/main/assets/lottie_printer_not_ready.json Normal file → Executable file
View File

0
baselib/src/main/assets/lottie_remove_card.json Normal file → Executable file
View File

0
baselib/src/main/assets/lottie_success.json Normal file → Executable file
View File

0
baselib/src/main/assets/lottie_timeout.json Normal file → Executable file
View File

0
baselib/src/main/assets/rubik.ttf Normal file → Executable file
View File

0
baselib/src/main/assets/rubik_medium.ttf Normal file → Executable file
View File

View File

View File

View File

@ -11,6 +11,7 @@ import com.sunmi.pay.hardware.aidl.AidlConstants;
import com.sunmi.pay.hardware.aidlv2.AidlConstantsV2; import com.sunmi.pay.hardware.aidlv2.AidlConstantsV2;
import com.sunmi.pay.hardware.aidlv2.security.SecurityOptV2; import com.sunmi.pay.hardware.aidlv2.security.SecurityOptV2;
import com.utsmyanmar.paylibs.Constant; import com.utsmyanmar.paylibs.Constant;
import com.utsmyanmar.paylibs.PayLibNex;
import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil; import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.secure.TriDes; import com.utsmyanmar.paylibs.utils.secure.TriDes;
@ -24,8 +25,11 @@ public final class TerminalKeyUtil {
public static final String TAG = TerminalKeyUtil.class.getSimpleName(); public static final String TAG = TerminalKeyUtil.class.getSimpleName();
private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase()); // private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase()); // KBZ UAT
private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // MPU
private static final byte[] work_key_data = new byte[16]; private static final byte[] work_key_data = new byte[16];
public static void initNexKey() { public static void initNexKey() {
byte[] IPEKByte = ByteUtil.hexStr2Bytes("5A4CFF6DE93F0488926166F3317EFD2F"); // IPEK byte[] IPEKByte = ByteUtil.hexStr2Bytes("5A4CFF6DE93F0488926166F3317EFD2F"); // IPEK
byte[] IPEKKCVByte = ByteUtil.hexStr2Bytes("1F0C18"); byte[] IPEKKCVByte = ByteUtil.hexStr2Bytes("1F0C18");
@ -36,6 +40,8 @@ public final class TerminalKeyUtil {
Arrays.fill(work_key_data, (byte) 0x31); Arrays.fill(work_key_data, (byte) 0x31);
PinPad pinPad = BaseApplication.getInstance().deviceEngine.getPinPad(); PinPad pinPad = BaseApplication.getInstance().deviceEngine.getPinPad();
int result = pinPad.writeMKey(9, main_key_data, main_key_data.length); int result = pinPad.writeMKey(9, main_key_data, main_key_data.length);
// //
// int resultPINKEY = pinPad.writeWKey(0, WorkKeyTypeEnum.PINKEY, work_key_data, work_key_data.length); // int resultPINKEY = pinPad.writeWKey(0, WorkKeyTypeEnum.PINKEY, work_key_data, work_key_data.length);
// int resultTDKEY = pinPad.writeWKey(0, WorkKeyTypeEnum.TDKEY, work_key_data, work_key_data.length); // int resultTDKEY = pinPad.writeWKey(0, WorkKeyTypeEnum.TDKEY, work_key_data, work_key_data.length);
@ -47,6 +53,12 @@ public final class TerminalKeyUtil {
// int result = pinPad.dukptKeyInject(9, DukptKeyTypeEnum.BDK,IPEKByte,16,ksn); // int result = pinPad.dukptKeyInject(9, DukptKeyTypeEnum.BDK,IPEKByte,16,ksn);
LogUtil.d(TAG, "save tmk key result: "+result); LogUtil.d(TAG, "save tmk key result: "+result);
byte[] encryptedPIK = SystemParamsOperation.getInstance().getKeyPIK().get(0);
result = pinPad.writeWKey(9, WorkKeyTypeEnum.PINKEY,encryptedPIK,encryptedPIK.length);
LogUtil.d(TAG, "save PIK key result: "+result);
// LogUtil.d(TAG, "save pin key result: "+resultPINKEY); // LogUtil.d(TAG, "save pin key result: "+resultPINKEY);
// LogUtil.d(TAG, "save tdk key result: "+resultTDKEY); // LogUtil.d(TAG, "save tdk key result: "+resultTDKEY);
// LogUtil.d(TAG, "save tek key result: "+resultTEK); // LogUtil.d(TAG, "save tek key result: "+resultTEK);

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

@ -34,10 +34,12 @@ public class SiriusInterceptor implements Interceptor {
String hashed = ""; String hashed = "";
String nonce = TerminalUtil.getInstance().generateRandomNumbers(); String nonce = TerminalUtil.getInstance().generateRandomNumbers();
// String nonce = "1234567";
try { try {
hashed = TerminalUtil.getInstance().generateHashedString(nonce); // hashed = TerminalUtil.getInstance().generateHashedString(nonce); // old tms
hashed = TerminalUtil.getInstance().generateHashedString(nonce).toLowerCase(); // new tms
// LogUtil.d(TAG,"hashed :"+ hashed); LogUtil.d(TAG,"hashed :"+ hashed);
} catch (NoSuchAlgorithmException e) { } catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@ -47,6 +49,7 @@ public class SiriusInterceptor implements Interceptor {
// .addHeader("content-type", "application/json") // .addHeader("content-type", "application/json")
.addHeader("request-id", hashed) .addHeader("request-id", hashed)
.addHeader("request-code",nonce) .addHeader("request-code",nonce)
// .addHeader("x-api-key","8f4df38d1001bcc4620b5c736c66a03eef4653eb3ba31105faa2f2ee294c4a46")
.build(); .build();
return chain.proceed(newRequest); return chain.proceed(newRequest);

Some files were not shown because too many files have changed in this diff Show More