Compare commits

..

3 Commits

Author SHA1 Message Date
moon
48add55380 add reprint in detail 2026-07-01 23:01:03 +06:30
moon
97d8d2abd9 font applied 2026-07-01 22:06:11 +06:30
moon
714e7d9820 add bypass http 2026-07-01 21:47:53 +06:30
18 changed files with 71 additions and 40 deletions

View File

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

View File

@ -29,6 +29,8 @@
<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,7 +39,6 @@ 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
@ -233,8 +232,7 @@ 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
) )
) )
@ -263,8 +261,7 @@ 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
) )
) )
} }
@ -284,7 +281,6 @@ 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,6 +35,7 @@ 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
@ -55,6 +56,7 @@ 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)
@ -132,7 +134,9 @@ fun AppNavGraph(
}, },
onNavigateRecentTransaction = { record -> onNavigateRecentTransaction = { record ->
recentPayDetails.firstOrNull { it.PID == record.pid }?.let { payDetail -> recentPayDetails.firstOrNull { it.PID == record.pid }?.let { payDetail ->
sharedViewModel.payDetail.value = payDetail sharedViewModel.setTransMenu(TransMenu.REPRINT)
sharedViewModel.isReprint.value = true
sharedViewModel.payDetail.value = prepareReprintPayDetail(payDetail)
transResultViewModel.onEvent( transResultViewModel.onEvent(
TransactionResultEvent.Start, TransactionResultEvent.Start,
sharedViewModel sharedViewModel

View File

@ -26,7 +26,6 @@ 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
@ -178,12 +177,12 @@ fun ReceiptPreview(
) { ) {
Text( Text(
text = "MOB POS", text = "MOB POS",
style = MaterialTheme.typography.headlineLarge.copy(fontFamily = FontFamily.Monospace) style = MaterialTheme.typography.headlineLarge
) )
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(8.dp))
Text( Text(
text = "Transaction Receipt", text = "Transaction Receipt",
style = MaterialTheme.typography.bodyMedium.copy(fontFamily = FontFamily.Monospace) style = MaterialTheme.typography.bodyMedium
) )
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
ReceiptDivider() ReceiptDivider()
@ -202,14 +201,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.copy(fontFamily = FontFamily.Monospace) style = MaterialTheme.typography.titleMedium
) )
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.copy(fontFamily = FontFamily.Monospace) style = MaterialTheme.typography.bodySmall
) )
} }
} }
@ -227,13 +226,13 @@ fun ReceiptRow(
) { ) {
Text( Text(
text = label, text = label,
style = MaterialTheme.typography.bodyMedium.copy(fontFamily = FontFamily.Monospace), style = MaterialTheme.typography.bodyMedium,
color = Color.Gray color = Color.Gray
) )
Text( Text(
text = value, text = value,
style = MaterialTheme.typography.titleSmall.copy(fontFamily = FontFamily.Monospace) style = MaterialTheme.typography.titleSmall
) )
} }
} }
@ -245,7 +244,6 @@ 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,7 +9,6 @@ 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
@ -84,6 +83,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 // return payDetail?.transCVM == TransCVM.SIGNATURE && payDetail.isFreeSign == false
// return true; return true;
} }

View File

@ -53,12 +53,11 @@ 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.Manual) } var selectedMode by remember { mutableStateOf(SignatureMode.Digital) }
var canvasSize by remember { mutableStateOf(Size.Zero) } var canvasSize by remember { mutableStateOf(Size.Zero) }
var strokeWidth = 6f var strokeWidth = 6f
@ -67,16 +66,15 @@ fun SignaturePad(
currentPath.clear() currentPath.clear()
} }
fun buildBitmap(): Bitmap? { fun buildBitmap(): Bitmap? {
if (selectedMode == SignatureMode.Digital) return null if (selectedMode == SignatureMode.Manual) 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) // fill white background first canvas.drawColor(android.graphics.Color.WHITE)
val paint = Paint().apply { val paint = Paint().apply {
color = android.graphics.Color.BLACK color = android.graphics.Color.BLACK
@ -129,15 +127,23 @@ fun SignaturePad(
) { ) {
Box( Box(
modifier = Modifier modifier = Modifier
.fillMaxWidth(0.85f) // narrower than full width, adjust as needed .fillMaxWidth(0.85f)
.height(180.dp) // fixed height instead of weight(1f) .height(180.dp)
.align(Alignment.CenterHorizontally) .align(Alignment.CenterHorizontally)
.background(Color.White, RoundedCornerShape(16.dp)) .background(
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(Unit) { .pointerInput(selectedMode) {
if (selectedMode == SignatureMode.Manual) return@pointerInput
detectDragGestures( detectDragGestures(
onDragStart = { startOffset -> onDragStart = { startOffset ->
currentPath.add(startOffset) currentPath.add(startOffset)
@ -193,7 +199,7 @@ fun SignaturePad(
) { ) {
SignatureModeOption( SignatureModeOption(
title = "Manual Sign", title = "Manual Sign",
subtitle = "Customer signs on screen", subtitle = "Signature on Paper",
selected = selectedMode == SignatureMode.Manual, selected = selectedMode == SignatureMode.Manual,
onClick = { selectedMode = SignatureMode.Manual }, onClick = { selectedMode = SignatureMode.Manual },
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
@ -203,7 +209,7 @@ fun SignaturePad(
SignatureModeOption( SignatureModeOption(
title = "Digital Sign", title = "Digital Sign",
subtitle = "Use stored signature", subtitle = "Draw on pad",
selected = selectedMode == SignatureMode.Digital, selected = selectedMode == SignatureMode.Digital,
onClick = { selectedMode = SignatureMode.Digital }, onClick = { selectedMode = SignatureMode.Digital },
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
@ -226,10 +232,6 @@ 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)
}, },

View File

@ -1,74 +1,93 @@
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,

Binary file not shown.

View File

@ -1,4 +1,7 @@
<?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

@ -0,0 +1,8 @@
<?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>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -50,7 +50,7 @@ public abstract class BaseXPrint {
protected String currentTime; protected String currentTime;
protected static final String typeface_name = "jbm_semibold.ttf"; protected static final String typeface_name = "jetBrainsMonoRegular.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"; // private String tmsAddress = "http://posuat.myanmarorientalbank.com:5033/api/v1";
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";