Compare commits

...

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

400 changed files with 1758 additions and 495 deletions

File diff suppressed because one or more lines are too long

View File

@ -13,6 +13,12 @@
</DropdownSelection> </DropdownSelection>
<DialogSelection /> <DialogSelection />
</SelectionState> </SelectionState>
<SelectionState runConfigName="testVoidPacket()">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
<SelectionState runConfigName="ExampleInstrumentedTest">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates> </selectionStates>
</component> </component>
</project> </project>

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

@ -11,11 +11,11 @@ android {
compileSdk 34 compileSdk 34
defaultConfig { defaultConfig {
applicationId "com.utsmm.kbz" applicationId "com.utsmm.kbz" //mpu
minSdk 24 minSdk 24
targetSdk 33 targetSdk 33
versionCode 5 versionCode 8
versionName "1.05" versionName "1.08"
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

@ -4,15 +4,15 @@
"type": "APK", "type": "APK",
"kind": "Directory" "kind": "Directory"
}, },
"applicationId": "com.utsmm.kbz", "applicationId": "com.utsmm.kbz.mpu",
"variantName": "release", "variantName": "release",
"elements": [ "elements": [
{ {
"type": "SINGLE", "type": "SINGLE",
"filters": [], "filters": [],
"attributes": [], "attributes": [],
"versionCode": 5, "versionCode": 8,
"versionName": "1.05", "versionName": "1.08",
"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,14 +46,15 @@
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"-->
<!-- android:name=".config.UTSManageSpaceActivity"/>--> <!-- android:name=".config.UTSManageSpaceActivity"/>-->
<activity android:name="com.utsmm.kbz.MainActivity" <activity android:name="com.utsmm.kbz.MainActivity"
android:exported="true"> android:exported="true"
android:showWhenLocked="true"
android:turnScreenOn="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />

View File

@ -382,6 +382,32 @@ public class MainActivity extends AppCompatActivity implements
SystemParamsOperation.getInstance().setSetupEcr(false); SystemParamsOperation.getInstance().setSetupEcr(false);
SystemParamsOperation.getInstance().setDownloadedParams(false); SystemParamsOperation.getInstance().setDownloadedParams(false);
handleAutoSettlementIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
handleAutoSettlementIntent(intent);
}
private void handleAutoSettlementIntent(Intent intent) {
if (intent == null) return;
boolean auto = intent.getBooleanExtra("AUTO_SETTLEMENT", false);
if (!auto) return;
com.utsmyanmar.paylibs.model.PayDetail payDetail = (com.utsmyanmar.paylibs.model.PayDetail) intent.getSerializableExtra("EXTRA_PAY_DETAIL");
if (payDetail != null) {
sharedViewModel.payDetail.setValue(payDetail);
sharedViewModel.transactionsType.setValue(com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType.SETTLEMENT);
try {
navController.navigate(R.id.transactionResultFragment);
} catch (Exception e) {
LogUtil.e(TAG, "Navigation error: " + e.getMessage());
}
}
} }
@Override @Override

View File

@ -36,6 +36,7 @@ import com.utsmyanmar.ecr.data.model.Transactions;
import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.print.PrintHelper; import com.utsmyanmar.paylibs.print.PrintHelper;
import com.utsmyanmar.paylibs.print.printx.PrintXReceipt;
import com.utsmyanmar.paylibs.utils.POSUtil; import com.utsmyanmar.paylibs.utils.POSUtil;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.enums.CurrencyType; import com.utsmyanmar.paylibs.utils.enums.CurrencyType;
@ -134,6 +135,8 @@ public class MainFragment extends DataBindingFragment {
sharedViewModel.setAmountExist(false); sharedViewModel.setAmountExist(false);
sharedViewModel.setCardDataExist(false); sharedViewModel.setCardDataExist(false);
sharedViewModel.setTransMenu(null); sharedViewModel.setTransMenu(null);
PrintXReceipt.getInstance().setSignatureBitmap(null);
updateButtonStatus(); updateButtonStatus();
delayFunctionCall(this::checkTerminalStatus); delayFunctionCall(this::checkTerminalStatus);
@ -292,7 +295,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() {
@ -844,6 +847,7 @@ public class MainFragment extends DataBindingFragment {
} else { } else {
processBatch(); processBatch();
sharedViewModel.transactionsType.setValue(TransactionsType.SALE); sharedViewModel.transactionsType.setValue(TransactionsType.SALE);
sharedViewModel.setTransMenu(TransMenu.SALE);
sharedViewModel.processCode.postValue(ProcessCode.SALE_PURCHASE + ProcessCode.SMART + ProcessCode.TO_ACCOUNT); sharedViewModel.processCode.postValue(ProcessCode.SALE_PURCHASE + ProcessCode.SMART + ProcessCode.TO_ACCOUNT);
navigateToAmount(); navigateToAmount();
} }

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

@ -7,6 +7,7 @@ import android.app.Service;
import android.content.Intent; import android.content.Intent;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.text.TextUtils;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
@ -23,8 +24,7 @@ import javax.inject.Inject;
import dagger.hilt.android.AndroidEntryPoint; import dagger.hilt.android.AndroidEntryPoint;
import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.LogUtil;
// Temporarily disabled Hilt @AndroidEntryPoint
// @AndroidEntryPoint
public class SmileSettleService extends Service { public class SmileSettleService extends Service {
private static final String TAG = SmileSettleService.class.getSimpleName(); private static final String TAG = SmileSettleService.class.getSimpleName();
@ -157,7 +157,131 @@ public class SmileSettleService extends Service {
// }catch (Exception e){ // }catch (Exception e){
// e.printStackTrace(); // e.printStackTrace();
// } // }
if(com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation.getInstance().getSettlementStatus()) {
final com.utsmyanmar.paylibs.isobuilder.builderx.ISOMsgX isoMsgX = new com.utsmyanmar.paylibs.isobuilder.builderx.ISOMsgX.ISOMsgXBuilder(
com.utsmyanmar.paylibs.isobuilder.builderx.ISOVersion.VERSION_1993,
com.utsmyanmar.paylibs.isobuilder.ISOMode.BOTH_HEADER_TPDU,
com.utsmyanmar.paylibs.utils.enums.HostName.BPC
).build();
repository.getSettlementPOS().observeForever(list -> {
int saleCount = 0;
long saleAmount = 0L;
int preCount = 0;
long preAmount = 0L;
int refundCount = 0;
long refundAmount = 0L;
int caCount = 0;
long caAmount = 0L;
if(list != null && !list.isEmpty()) {
for (com.utsmyanmar.paylibs.model.PayDetail pay : list) {
if (pay.getTransactionType() == com.utsmyanmar.paylibs.utils.iso_utils.TransactionType.SALE && !pay.isCanceled) {
saleCount++;
saleAmount += pay.getAmount();
} else if (pay.getTransactionType() == com.utsmyanmar.paylibs.utils.iso_utils.TransactionType.PRE_SALE_COMPLETE && !pay.isCanceled) {
preCount++;
preAmount += pay.getAmount();
} else if (pay.getTransactionType() == com.utsmyanmar.paylibs.utils.iso_utils.TransactionType.REFUND) {
refundCount++;
refundAmount += pay.getAmount();
} else if (pay.getTransactionType() == com.utsmyanmar.paylibs.utils.iso_utils.TransactionType.CASH_ADVANCE) {
caCount++;
caAmount += pay.getAmount();
}
}
}
com.utsmyanmar.paylibs.model.TradeData tradeData = com.utsmyanmar.paylibs.utils.params.Params.newTrade(true);
com.utsmyanmar.paylibs.model.PayDetail payDetail = tradeData.getPayDetail();
String bitmap = com.utsmyanmar.paylibs.utils.iso_utils.BitmapConfig.BPC_SETTLEMENT;
payDetail.setTransType(com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType.SETTLEMENT.name);
payDetail.setTransactionType(com.utsmyanmar.paylibs.utils.iso_utils.TransactionType.SETTLEMENT);
payDetail.setProcessCode(com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType.SETTLEMENT.processCode);
payDetail.setBatchNo(com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation.getInstance().getCurrentBatchNum());
com.utsmyanmar.paylibs.model.SettleData settleData = new com.utsmyanmar.paylibs.model.SettleData(
saleCount,
saleAmount,
preCount,
preAmount,
refundCount,
refundAmount,
caCount,
caAmount
);
payDetail.setSettleDataObj(settleData);
long totalAmount = saleAmount + preAmount + refundAmount + caAmount;
String settlementData;
if (refundAmount != 0L) {
long creditTotal = saleAmount + preAmount + caAmount;
long subTotal = creditTotal - refundAmount;
if (subTotal < 0L) {
settlementData = "D" + String.format(java.util.Locale.getDefault(), "%012d", Math.abs(subTotal));
} else {
settlementData = "C" + String.format(java.util.Locale.getDefault(), "%012d", subTotal);
}
} else {
settlementData = "C" + String.format(java.util.Locale.getDefault(), "%012d", totalAmount);
}
payDetail.setSettleData(settlementData);
payDetail.setAmount(totalAmount);
tradeData.setPayDetail(payDetail);
tradeData.setField60(com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation.getInstance().getCurrentBatchNum());
byte[] sendBytes = isoMsgX.buildISOPackets(tradeData, bitmap, com.utsmyanmar.paylibs.utils.MessageType.SETTLEMENT);
com.utsmyanmar.paylibs.network.ISOSocket.getInstance().enqueue(sendBytes, sendBytes.length, false, new com.utsmyanmar.paylibs.network.ISOCallback() {
@Override
public void onReceive(byte[] bytes, int length) {
java.util.Map<String, com.utsmyanmar.paylibs.model.MsgField> responseMap = isoMsgX.parseISOPackets(bytes, length);
if (responseMap != null) {
String resultStr = "";
try {
resultStr = responseMap.get("F039").getDataStr();
} catch (NullPointerException e) {
e.printStackTrace();
payDetail.setIsNeedReversal(true);
return;
}
payDetail.setTradeAnswerCode(resultStr);
if (TextUtils.equals(resultStr, com.utsmyanmar.paylibs.Constant.ANSWER_CODE_ACCEPT) || TextUtils.equals(resultStr, com.utsmyanmar.paylibs.Constant.ANSWER_CODE_APPROVED)) {
payDetail.setIsNeedReversal(false);
} else if (TextUtils.equals(resultStr, "95") || TextUtils.equals(resultStr, "095")) {
payDetail.setIsNeedReversal(true);
}
}
}
@Override
public void onError(String msg) {
com.utsmyanmar.paylibs.network.ISOSocket.getInstance().switchIp();
com.utsmyanmar.paylibs.network.ISOSocket.getInstance().enqueue(sendBytes, sendBytes.length, false, this);
}
@Override
public void onComplete() {
if(list != null && !list.isEmpty()) {
for (com.utsmyanmar.paylibs.model.PayDetail p : list) {
repository.deletePayDetail(p);
}
}
repository.insertPayDetail(payDetail);
Intent uiIntent = new Intent(getApplicationContext(), com.utsmm.kbz.MainActivity.class);
uiIntent.putExtra("AUTO_SETTLEMENT", true);
uiIntent.putExtra("EXTRA_TRANSACTION_TYPE", com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType.SETTLEMENT.value);
uiIntent.putExtra("EXTRA_PAY_DETAIL", payDetail);
uiIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(uiIntent);
}
});
});
}
return START_NOT_STICKY; return START_NOT_STICKY;
} }

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

@ -220,6 +220,7 @@ public class InputRRNFragment extends DataBindingFragment {
newPay = transProcessViewModel.getPayDetail(); newPay = transProcessViewModel.getPayDetail();
} }
newPay.setReferNo(rrnNo); newPay.setReferNo(rrnNo);
if(sharedViewModel.getTransMenu().getValue() == TransMenu.PRE_AUTH_FULL_VOID) { if(sharedViewModel.getTransMenu().getValue() == TransMenu.PRE_AUTH_FULL_VOID) {
newPay.setAmount(payDetail.getAmount()); newPay.setAmount(payDetail.getAmount());
@ -311,7 +312,9 @@ public class InputRRNFragment extends DataBindingFragment {
} }
newPay.setReferNo(rrnNo); newPay.setReferNo(rrnNo);
newPay.setApprovalCode(payDetail.getApprovalCode());
newPay.setTradeTime(payDetail.getTradeTime());
newPay.setTradeDate(payDetail.getTradeDate());
if(newPay.getAmount() > payDetail.getAmount()) { if(newPay.getAmount() > payDetail.getAmount()) {
newPay.setTradeAnswerCode("C1"); // ---> refer to BaseErrorCode class// , newPay.setTradeAnswerCode("C1"); // ---> refer to BaseErrorCode class// ,
newPay.setTransType(sharedViewModel.transactionsType.getValue().name); newPay.setTransType(sharedViewModel.transactionsType.getValue().name);

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.setValue(sharedViewModel.transactionsType.getValue());
pinPadViewModel.transType.setValue(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

@ -16,6 +16,8 @@ import com.utsmm.kbz.R;
import com.utsmm.kbz.config.Constants; import com.utsmm.kbz.config.Constants;
import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel; import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel;
import com.utsmyanmar.paylibs.print.printx.PrintX;
import com.utsmyanmar.paylibs.print.printx.PrintXReceipt;
import com.utsmyanmar.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.LogUtil;
public class SignatureFragment extends DataBindingFragment { public class SignatureFragment extends DataBindingFragment {
@ -138,6 +140,7 @@ public class SignatureFragment extends DataBindingFragment {
// Handle digital signature // Handle digital signature
if (isSigned) { if (isSigned) {
sharedViewModel.signBitmap = mSignaturePad.getSignatureBitmap(); sharedViewModel.signBitmap = mSignaturePad.getSignatureBitmap();
PrintXReceipt.getInstance().setSignatureBitmap(mSignaturePad.getSignatureBitmap());
LogUtil.d(TAG, "Digital signature confirmed and stored"); LogUtil.d(TAG, "Digital signature confirmed and stored");
callNextScreen(); callNextScreen();
} else { } else {
@ -146,8 +149,8 @@ public class SignatureFragment extends DataBindingFragment {
} else { } else {
// Handle manual signature on paper // Handle manual signature on paper
sharedViewModel.signBitmap = null; // No digital signature sharedViewModel.signBitmap = null; // No digital signature
PrintXReceipt.getInstance().setSignatureBitmap(null);
LogUtil.d(TAG, "Manual signature on paper selected - no digital signature stored"); LogUtil.d(TAG, "Manual signature on paper selected - no digital signature stored");
showSingleInfoDialog("Please sign on the printed receipt manually and proceed.");
callNextScreen(); callNextScreen();
} }
} }

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();
@ -146,6 +147,8 @@ public class TransactionResultFragment extends DataBindingFragment implements Da
PayDetail payDetail = sharedViewModel.payDetail.getValue(); PayDetail payDetail = sharedViewModel.payDetail.getValue();
if (payDetail == null) { if (payDetail == null) {
navigateToMainScreen(); navigateToMainScreen();
return; return;

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

@ -316,7 +316,9 @@ public class SettlementTransactionFragment extends DataBindingFragment implement
dismissLoadingDialog(); dismissLoadingDialog();
updateData(); updateData();
if (!SystemParamsOperation.getInstance().getDemoStatus()) { if (!SystemParamsOperation.getInstance().getDemoStatus()) {
networkCutOver();
// networkCutOver(); // bpc
navigateToNext();
} else { } else {
navigateToNext(); navigateToNext();
} }

View File

@ -121,7 +121,7 @@ public class SettlementViewModel extends ViewModel {
ca_count.setValue(0); ca_count.setValue(0);
ca_amount.setValue(0L); ca_amount.setValue(0L);
isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1993, ISOMode.BOTH_HEADER_TPDU,HostName.BPC) isoMsgX = new ISOMsgX.ISOMsgXBuilder(ISOVersion.VERSION_1987, ISOMode.ONLY_HEADER,HostName.FINEXUS)
.build(); .build();
// setUpSettlementData(); // setUpSettlementData();
@ -339,7 +339,7 @@ public class SettlementViewModel extends ViewModel {
HostName hostName = HostName.BPC; HostName hostName = HostName.FINEXUS;
String field60 = SystemParamsOperation.getInstance().getCurrentBatchNum(); String field60 = SystemParamsOperation.getInstance().getCurrentBatchNum();
@ -361,14 +361,26 @@ public class SettlementViewModel extends ViewModel {
payDetail = tradeData.getPayDetail(); payDetail = tradeData.getPayDetail();
bitmap = BitmapConfig.BPC_SETTLEMENT; //
if(hostName == HostName.BPC) {
bitmap = BitmapConfig.BPC_SETTLEMENT;
} else {
bitmap = BitmapConfig.MPU_NEW_SETTLE;
}
payDetail.setTransType(TransactionsType.SETTLEMENT.name); payDetail.setTransType(TransactionsType.SETTLEMENT.name);
payDetail.setTransactionType(TransactionType.SETTLEMENT); payDetail.setTransactionType(TransactionType.SETTLEMENT);
if (!flag) { if (!flag) {
payDetail.setProcessCode(TransactionsType.SETTLEMENT.processCode); payDetail.setProcessCode(TransactionsType.SETTLEMENT.processCode);
} else { } else {
bitmap = BitmapConfig.BPC_SETTLEMENT_TRAILER; if(hostName == HostName.BPC) {
payDetail.setProcessCode("910000"); bitmap = BitmapConfig.BPC_SETTLEMENT_TRAILER;
payDetail.setProcessCode("910000");
} else {
bitmap = BitmapConfig.MPU_NEW_SETTLE;
payDetail.setProcessCode("960000");
}
} }
// CA:CA - CD - FT // CA:CA - CD - FT
@ -403,7 +415,8 @@ public class SettlementViewModel extends ViewModel {
payDetail.setSettleData(settlementData); payDetail.setSettleData(settlementData);
payDetail.setAmount(totalAmount); payDetail.setAmount(totalAmount);
} else { } else {
payDetail.setSettleData(totalSaleCount + totalSaleAmount + totalRefundCount + totalRefundAmount + totalDebitSaleCount + totalDebitSaleAmount + totalERefundCount + totalERefundAmount); //field 63 // payDetail.setSettleData(totalSaleCount + totalSaleAmount + totalRefundCount + totalRefundAmount + totalDebitSaleCount + totalDebitSaleAmount + totalERefundCount + totalERefundAmount); //field 63 BPC
payDetail.setSettleData(totalSaleCount + totalSaleAmount + totalRefundCount + totalRefundAmount + totalDebitSaleCount + totalDebitSaleAmount ); //field 63
} }

View File

@ -213,6 +213,7 @@ public class TMSProcessFragment extends DataBindingFragment {
CurrencyType currencyType = SystemParamsOperation.getInstance().getCurrencyType(); CurrencyType currencyType = SystemParamsOperation.getInstance().getCurrencyType();
sharedViewModel.set_currencyText(currencyType.name); sharedViewModel.set_currencyText(currencyType.name);
// tmsProcessViewModel.loadEmvParameters(); // tmsProcessViewModel.loadEmvParameters();
// scheduleAutoSettlement();
navigateToMain(); navigateToMain();
} }
}); });
@ -224,4 +225,48 @@ public class TMSProcessFragment extends DataBindingFragment {
} }
private void scheduleAutoSettlement() {
String timeStr = SystemParamsOperation.getInstance().getClearBatchTime();
if(timeStr == null || timeStr.trim().isEmpty()) {
return;
}
String[] parts = timeStr.trim().split(":");
if(parts.length != 2) {
return;
}
int hour;
int minute;
try {
hour = Integer.parseInt(parts[0]);
minute = Integer.parseInt(parts[1]);
} catch (Exception e) {
return;
}
android.app.AlarmManager alarmManager = (android.app.AlarmManager) requireContext().getSystemService(android.content.Context.ALARM_SERVICE);
if(alarmManager == null) return;
java.util.Calendar calendar = java.util.Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(java.util.Calendar.HOUR_OF_DAY, hour);
calendar.set(java.util.Calendar.MINUTE, minute);
calendar.set(java.util.Calendar.SECOND, 0);
long triggerAtMillis = calendar.getTimeInMillis();
if(System.currentTimeMillis() > triggerAtMillis) {
calendar.add(java.util.Calendar.DAY_OF_YEAR, 1);
triggerAtMillis = calendar.getTimeInMillis();
}
android.content.Intent intent = new android.content.Intent(requireContext(), com.utsmm.kbz.service.SmileAlarmReceiver.class);
android.app.PendingIntent pendingIntent = android.app.PendingIntent.getBroadcast(
requireContext(),
1001,
intent,
android.app.PendingIntent.FLAG_UPDATE_CURRENT
);
alarmManager.setRepeating(android.app.AlarmManager.RTC_WAKEUP, triggerAtMillis, android.app.AlarmManager.INTERVAL_DAY, pendingIntent);
}
} }

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("2912")
.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

@ -235,6 +235,86 @@
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
<!-- &lt;!&ndash; Demo Mode Card &ndash;&gt;-->
<!-- <androidx.cardview.widget.CardView-->
<!-- android:id="@+id/demoCard"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginBottom="12dp"-->
<!-- android:clickable="true"-->
<!-- android:foreground="?android:attr/selectableItemBackground"-->
<!-- android:onClick="@{()->click.onDemoClick()}"-->
<!-- app:cardBackgroundColor="@color/white"-->
<!-- app:cardCornerRadius="16dp"-->
<!-- app:cardElevation="2dp">-->
<!-- <LinearLayout-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:gravity="center_vertical"-->
<!-- android:orientation="horizontal"-->
<!-- android:padding="20dp">-->
<!-- <androidx.cardview.widget.CardView-->
<!-- android:layout_width="48dp"-->
<!-- android:layout_height="48dp"-->
<!-- android:layout_marginEnd="16dp"-->
<!-- app:cardBackgroundColor="@color/colorPrimary"-->
<!-- app:cardCornerRadius="24dp"-->
<!-- app:cardElevation="0dp">-->
<!-- <ImageView-->
<!-- android:layout_width="24dp"-->
<!-- android:layout_height="24dp"-->
<!-- android:layout_gravity="center"-->
<!-- android:src="@drawable/ic_swap"-->
<!-- app:tint="@color/white" />-->
<!-- </androidx.cardview.widget.CardView>-->
<!-- <LinearLayout-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_weight="1"-->
<!-- android:orientation="vertical">-->
<!-- <TextView-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:fontFamily="@font/rubik_medium"-->
<!-- android:text="Reversal On/Off"-->
<!-- android:textColor="@color/colorTextTitle"-->
<!-- android:textSize="18sp"-->
<!-- android:textStyle="bold"-->
<!-- tools:fontFamily="sans-serif-medium" />-->
<!-- <TextView-->
<!-- android:id="@+id/reversalSwitch"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginTop="2dp"-->
<!-- android:fontFamily="@font/rubik_regular"-->
<!-- android:text="Demo mode active - Test transactions"-->
<!-- android:textColor="@color/colorTextContent"-->
<!-- android:textSize="14sp"-->
<!-- tools:fontFamily="sans-serif" />-->
<!-- </LinearLayout>-->
<!-- <Switch-->
<!-- android:id="@+id/demoSwitch"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginStart="8dp"-->
<!-- android:clickable="false"-->
<!-- android:focusable="false" />-->
<!-- </LinearLayout>-->
<!-- </androidx.cardview.widget.CardView>-->
<!-- Demo Mode Card --> <!-- Demo Mode Card -->
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:id="@+id/demoCard" android:id="@+id/demoCard"

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

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