Compare commits

..

No commits in common. "48add553800290333a827d793041118790e3fe93" and "665bf1d5dfd0e0b59beaa257a942ba3ebbf91377" have entirely different histories.

18 changed files with 40 additions and 71 deletions

View File

@ -43,8 +43,8 @@ android {
dimension = "env" dimension = "env"
applicationIdSuffix = ".uat" applicationIdSuffix = ".uat"
versionNameSuffix = "-UAT" versionNameSuffix = "-UAT"
versionCode = 10 versionCode = 3
versionName = "2.8" versionName = "2.1"
buildConfigField("String", "ENV", "\"UAT\"") buildConfigField("String", "ENV", "\"UAT\"")
resValue("string", "app_name", "MOB-UAT") resValue("string", "app_name", "MOB-UAT")
} }

View File

@ -29,8 +29,6 @@
<application <application
android:name="com.mob.utsmyanmar.MyApplication" android:name="com.mob.utsmyanmar.MyApplication"
android:allowBackup="true" android:allowBackup="true"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"

View File

@ -39,6 +39,7 @@ import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.input.TextFieldValue
@ -232,7 +233,8 @@ private fun ManualCardEntryScreen(
singleLine = true, singleLine = true,
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
textStyle = MaterialTheme.typography.bodyLarge.copy( textStyle = MaterialTheme.typography.bodyLarge.copy(
letterSpacing = 2.sp letterSpacing = 2.sp,
fontFamily = FontFamily.Monospace
) )
) )
@ -261,7 +263,8 @@ private fun ManualCardEntryScreen(
.width(160.dp) .width(160.dp)
.focusRequester(expiryFocusRequester), .focusRequester(expiryFocusRequester),
textStyle = MaterialTheme.typography.bodyLarge.copy( textStyle = MaterialTheme.typography.bodyLarge.copy(
letterSpacing = 2.sp letterSpacing = 2.sp,
fontFamily = FontFamily.Monospace
) )
) )
} }
@ -281,6 +284,7 @@ private fun ManualCardEntryScreen(
Text( Text(
text = "**** **** **** ${pan.takeLast(4)}", text = "**** **** **** ${pan.takeLast(4)}",
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
fontFamily = FontFamily.Monospace,
letterSpacing = 1.5.sp letterSpacing = 1.5.sp
) )
if (expiry.length == 4) { if (expiry.length == 4) {

View File

@ -35,7 +35,6 @@ import com.mob.utsmyanmar.ui.processing_card.ProcessingCardRoute
import com.mob.utsmyanmar.ui.processing_card.ProcessingCardViewModel import com.mob.utsmyanmar.ui.processing_card.ProcessingCardViewModel
import com.mob.utsmyanmar.ui.refund_rrn.InputRrnRoute import com.mob.utsmyanmar.ui.refund_rrn.InputRrnRoute
import com.mob.utsmyanmar.ui.refund_rrn.RRNViewModel import com.mob.utsmyanmar.ui.refund_rrn.RRNViewModel
import com.mob.utsmyanmar.ui.history_functions.prepareReprintPayDetail
import com.mob.utsmyanmar.ui.sale_void.TranDetailPage import com.mob.utsmyanmar.ui.sale_void.TranDetailPage
import com.mob.utsmyanmar.ui.sale_void.VoidTraceScreen import com.mob.utsmyanmar.ui.sale_void.VoidTraceScreen
import com.mob.utsmyanmar.ui.sale_void.VoidViewModel import com.mob.utsmyanmar.ui.sale_void.VoidViewModel
@ -56,7 +55,6 @@ import com.mob.utsmyanmar.viewmodel.EmvTransactionProcessViewModel
import com.mob.utsmyanmar.viewmodel.SharedViewModel import com.mob.utsmyanmar.viewmodel.SharedViewModel
import com.mob.utsmyanmar.viewmodel.TransProcessViewModel import com.mob.utsmyanmar.viewmodel.TransProcessViewModel
import com.utsmyanmar.paylibs.model.TradeData import com.utsmyanmar.paylibs.model.TradeData
import com.utsmyanmar.paylibs.utils.enums.TransMenu
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType
@RequiresApi(Build.VERSION_CODES.N) @RequiresApi(Build.VERSION_CODES.N)
@ -134,9 +132,7 @@ fun AppNavGraph(
}, },
onNavigateRecentTransaction = { record -> onNavigateRecentTransaction = { record ->
recentPayDetails.firstOrNull { it.PID == record.pid }?.let { payDetail -> recentPayDetails.firstOrNull { it.PID == record.pid }?.let { payDetail ->
sharedViewModel.setTransMenu(TransMenu.REPRINT) sharedViewModel.payDetail.value = payDetail
sharedViewModel.isReprint.value = true
sharedViewModel.payDetail.value = prepareReprintPayDetail(payDetail)
transResultViewModel.onEvent( transResultViewModel.onEvent(
TransactionResultEvent.Start, TransactionResultEvent.Start,
sharedViewModel sharedViewModel

View File

@ -26,6 +26,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
@ -177,12 +178,12 @@ fun ReceiptPreview(
) { ) {
Text( Text(
text = "MOB POS", text = "MOB POS",
style = MaterialTheme.typography.headlineLarge style = MaterialTheme.typography.headlineLarge.copy(fontFamily = FontFamily.Monospace)
) )
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(8.dp))
Text( Text(
text = "Transaction Receipt", text = "Transaction Receipt",
style = MaterialTheme.typography.bodyMedium style = MaterialTheme.typography.bodyMedium.copy(fontFamily = FontFamily.Monospace)
) )
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
ReceiptDivider() ReceiptDivider()
@ -201,14 +202,14 @@ fun ReceiptPreview(
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(8.dp))
Text( Text(
text = "Thank You", text = "Thank You",
style = MaterialTheme.typography.titleMedium style = MaterialTheme.typography.titleMedium.copy(fontFamily = FontFamily.Monospace)
) )
Spacer(modifier = Modifier.height(4.dp)) Spacer(modifier = Modifier.height(4.dp))
Text( Text(
text = "Please keep this receipt", text = "Please keep this receipt",
style = MaterialTheme.typography.bodySmall style = MaterialTheme.typography.bodySmall.copy(fontFamily = FontFamily.Monospace)
) )
} }
} }
@ -226,13 +227,13 @@ fun ReceiptRow(
) { ) {
Text( Text(
text = label, text = label,
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium.copy(fontFamily = FontFamily.Monospace),
color = Color.Gray color = Color.Gray
) )
Text( Text(
text = value, text = value,
style = MaterialTheme.typography.titleSmall style = MaterialTheme.typography.titleSmall.copy(fontFamily = FontFamily.Monospace)
) )
} }
} }
@ -244,6 +245,7 @@ fun ReceiptDivider() {
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = 10.dp), .padding(vertical = 10.dp),
text = "--------------------------------", text = "--------------------------------",
fontFamily = FontFamily.Monospace,
color = Color.Gray color = Color.Gray
) )
} }

View File

@ -9,6 +9,7 @@ import com.mob.utsmyanmar.model.TransactionStatus
import com.mob.utsmyanmar.ui.settlement.SettlementViewModel import com.mob.utsmyanmar.ui.settlement.SettlementViewModel
import com.mob.utsmyanmar.viewmodel.SharedViewModel import com.mob.utsmyanmar.viewmodel.SharedViewModel
import com.mob.utsmyanmar.viewmodel.TransProcessViewModel import com.mob.utsmyanmar.viewmodel.TransProcessViewModel
import com.utsmyanmar.paylibs.model.enums.TransCVM
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType
private const val MOCK_HOST_DELAY_MS = 2000L private const val MOCK_HOST_DELAY_MS = 2000L
@ -83,6 +84,6 @@ fun ProcessingRoute(
} }
private fun requiresSignature(payDetail: com.utsmyanmar.paylibs.model.PayDetail?): Boolean { private fun requiresSignature(payDetail: com.utsmyanmar.paylibs.model.PayDetail?): Boolean {
// return payDetail?.transCVM == TransCVM.SIGNATURE && payDetail.isFreeSign == false return payDetail?.transCVM == TransCVM.SIGNATURE && !payDetail.isFreeSign
return true; // return true;
} }

View File

@ -53,11 +53,12 @@ fun SignaturePad(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
signatureColor: Color = Color.Black, signatureColor: Color = Color.Black,
onBack: () -> Unit = {}, onBack: () -> Unit = {},
// signatureBlob is null for Digital mode (using stored signature) or when nothing was drawn
onConfirm: (SignatureMode, Bitmap?, signatureBlob: ByteArray?) -> Unit = { _, _, _ -> } onConfirm: (SignatureMode, Bitmap?, signatureBlob: ByteArray?) -> Unit = { _, _, _ -> }
) { ) {
val paths = remember { mutableStateListOf<List<Offset>>() } val paths = remember { mutableStateListOf<List<Offset>>() }
val currentPath = remember { mutableStateListOf<Offset>() } val currentPath = remember { mutableStateListOf<Offset>() }
var selectedMode by remember { mutableStateOf(SignatureMode.Digital) } var selectedMode by remember { mutableStateOf(SignatureMode.Manual) }
var canvasSize by remember { mutableStateOf(Size.Zero) } var canvasSize by remember { mutableStateOf(Size.Zero) }
var strokeWidth = 6f var strokeWidth = 6f
@ -66,15 +67,16 @@ fun SignaturePad(
currentPath.clear() currentPath.clear()
} }
fun buildBitmap(): Bitmap? { fun buildBitmap(): Bitmap? {
if (selectedMode == SignatureMode.Manual) return null if (selectedMode == SignatureMode.Digital) return null
if (paths.isEmpty() && currentPath.isEmpty()) return null if (paths.isEmpty() && currentPath.isEmpty()) return null
if (canvasSize.width <= 0f || canvasSize.height <= 0f) return null if (canvasSize.width <= 0f || canvasSize.height <= 0f) return null
val bitmap = val bitmap =
createBitmap(canvasSize.width.toInt(), canvasSize.height.toInt(), Bitmap.Config.RGB_565) createBitmap(canvasSize.width.toInt(), canvasSize.height.toInt(), Bitmap.Config.RGB_565)
val canvas = AndroidCanvas(bitmap) val canvas = AndroidCanvas(bitmap)
canvas.drawColor(android.graphics.Color.WHITE) canvas.drawColor(android.graphics.Color.WHITE) // fill white background first
val paint = Paint().apply { val paint = Paint().apply {
color = android.graphics.Color.BLACK color = android.graphics.Color.BLACK
@ -127,23 +129,15 @@ fun SignaturePad(
) { ) {
Box( Box(
modifier = Modifier modifier = Modifier
.fillMaxWidth(0.85f) .fillMaxWidth(0.85f) // narrower than full width, adjust as needed
.height(180.dp) .height(180.dp) // fixed height instead of weight(1f)
.align(Alignment.CenterHorizontally) .align(Alignment.CenterHorizontally)
.background( .background(Color.White, RoundedCornerShape(16.dp))
color = if (selectedMode == SignatureMode.Digital) {
Color.White
} else {
Color.White.copy(alpha = 0.55f)
},
shape = RoundedCornerShape(16.dp)
)
.padding(12.dp) .padding(12.dp)
.onSizeChanged { size -> .onSizeChanged { size ->
canvasSize = Size(size.width.toFloat(), size.height.toFloat()) canvasSize = Size(size.width.toFloat(), size.height.toFloat())
} }
.pointerInput(selectedMode) { .pointerInput(Unit) {
if (selectedMode == SignatureMode.Manual) return@pointerInput
detectDragGestures( detectDragGestures(
onDragStart = { startOffset -> onDragStart = { startOffset ->
currentPath.add(startOffset) currentPath.add(startOffset)
@ -199,7 +193,7 @@ fun SignaturePad(
) { ) {
SignatureModeOption( SignatureModeOption(
title = "Manual Sign", title = "Manual Sign",
subtitle = "Signature on Paper", subtitle = "Customer signs on screen",
selected = selectedMode == SignatureMode.Manual, selected = selectedMode == SignatureMode.Manual,
onClick = { selectedMode = SignatureMode.Manual }, onClick = { selectedMode = SignatureMode.Manual },
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
@ -209,7 +203,7 @@ fun SignaturePad(
SignatureModeOption( SignatureModeOption(
title = "Digital Sign", title = "Digital Sign",
subtitle = "Draw on pad", subtitle = "Use stored signature",
selected = selectedMode == SignatureMode.Digital, selected = selectedMode == SignatureMode.Digital,
onClick = { selectedMode = SignatureMode.Digital }, onClick = { selectedMode = SignatureMode.Digital },
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
@ -232,6 +226,10 @@ fun SignaturePad(
Button( Button(
onClick = { onClick = {
val bitmap = buildBitmap() val bitmap = buildBitmap()
if (selectedMode == SignatureMode.Manual && bitmap == null) {
// nothing drawn yet on Manual mode — block confirm
return@Button
}
val signatureBlob = bitmap?.let { bitmapToBlob(it) } val signatureBlob = bitmap?.let { bitmapToBlob(it) }
onConfirm(selectedMode, bitmap, signatureBlob) onConfirm(selectedMode, bitmap, signatureBlob)
}, },
@ -299,4 +297,4 @@ fun SignaturePadPreview() {
MOBPOSTheme { MOBPOSTheme {
SignaturePad() SignaturePad()
} }
} }

View File

@ -1,96 +1,77 @@
package com.mob.utsmyanmar.ui.theme package com.mob.utsmyanmar.ui.theme
import androidx.compose.ui.text.font.Font
import androidx.compose.material3.Typography import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import com.mob.utsmyanmar.R
private val LibreBaskerville = FontFamily(
Font(R.font.libre_baskerville_regular, FontWeight.Normal)
)
val Typography = Typography( val Typography = Typography(
displayLarge = TextStyle( displayLarge = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
fontSize = 32.sp, fontSize = 32.sp,
lineHeight = 40.sp, lineHeight = 40.sp,
), ),
displayMedium = TextStyle( displayMedium = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
fontSize = 30.sp, fontSize = 30.sp,
lineHeight = 38.sp, lineHeight = 38.sp,
), ),
headlineLarge = TextStyle( headlineLarge = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
fontSize = 24.sp, fontSize = 24.sp,
lineHeight = 32.sp, lineHeight = 32.sp,
), ),
headlineMedium = TextStyle( headlineMedium = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
fontSize = 20.sp, fontSize = 20.sp,
lineHeight = 28.sp, lineHeight = 28.sp,
), ),
titleLarge = TextStyle( titleLarge = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.SemiBold, fontWeight = FontWeight.SemiBold,
fontSize = 22.sp, fontSize = 22.sp,
lineHeight = 28.sp, lineHeight = 28.sp,
), ),
titleMedium = TextStyle( titleMedium = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.SemiBold, fontWeight = FontWeight.SemiBold,
fontSize = 18.sp, fontSize = 18.sp,
lineHeight = 26.sp, lineHeight = 26.sp,
), ),
titleSmall = TextStyle( titleSmall = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
fontSize = 14.sp, fontSize = 14.sp,
lineHeight = 20.sp, lineHeight = 20.sp,
), ),
bodyLarge = TextStyle( bodyLarge = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.Normal, fontWeight = FontWeight.Normal,
fontSize = 16.sp, fontSize = 16.sp,
lineHeight = 24.sp, lineHeight = 24.sp,
letterSpacing = 0.5.sp letterSpacing = 0.5.sp
), ),
bodyMedium = TextStyle( bodyMedium = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.Normal, fontWeight = FontWeight.Normal,
fontSize = 14.sp, fontSize = 14.sp,
lineHeight = 20.sp, lineHeight = 20.sp,
), ),
bodySmall = TextStyle( bodySmall = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.Normal, fontWeight = FontWeight.Normal,
fontSize = 12.sp, fontSize = 12.sp,
lineHeight = 16.sp, lineHeight = 16.sp,
), ),
labelLarge = TextStyle( labelLarge = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
fontSize = 14.sp, fontSize = 14.sp,
lineHeight = 20.sp, lineHeight = 20.sp,
), ),
labelMedium = TextStyle( labelMedium = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
fontSize = 12.sp, fontSize = 12.sp,
lineHeight = 16.sp, lineHeight = 16.sp,
), ),
labelSmall = TextStyle( labelSmall = TextStyle(
fontFamily = LibreBaskerville,
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Medium,
fontSize = 11.sp, fontSize = 11.sp,
lineHeight = 16.sp, lineHeight = 16.sp,
letterSpacing = 0.5.sp letterSpacing = 0.5.sp
) )
) )

View File

@ -1,7 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="Theme.MOBPOS" parent="android:style/Theme.Material.Light.NoActionBar"> <style name="Theme.MOBPOS" parent="android:style/Theme.Material.Light.NoActionBar"/>
<item name="fontFamily">@font/libre_baskerville_regular</item>
<item name="android:fontFamily">@font/libre_baskerville_regular</item>
</style>
</resources> </resources>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">posuat.myanmarorientalbank.com:5033</domain>
</domain-config>
</network-security-config>

View File

@ -50,7 +50,7 @@ public abstract class BaseXPrint {
protected String currentTime; protected String currentTime;
protected static final String typeface_name = "jetBrainsMonoRegular.ttf"; protected static final String typeface_name = "jbm_semibold.ttf";
protected static final String MPU_AID = "A0000004820000000001"; protected static final String MPU_AID = "A0000004820000000001";
protected static final String HOST_NAME_VM = "VISA/ MASTERCARD"; protected static final String HOST_NAME_VM = "VISA/ MASTERCARD";

View File

@ -38,7 +38,7 @@ public class SystemParamsSettings implements Serializable {
private boolean checkExpSwitch = false; private boolean checkExpSwitch = false;
// private String tmsAddress = "http://posuat.myanmarorientalbank.com:5033/api/v1"; // private String tmsAddress = "http://posuat.myanmarorientalbank.com:5033";
private String tmsAddress = "https://sirius-nest.utsmyanmar.com/api/v1"; private String tmsAddress = "https://sirius-nest.utsmyanmar.com/api/v1";
// private String tmsAddress = "http://128.199.170.203"; // private String tmsAddress = "http://128.199.170.203";