diff --git a/.gitignore b/.gitignore
index 03a5ecb..ef995b8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,4 @@
.cxx
local.properties
/.idea
+/.idea
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 7061a0d..82d900e 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -57,5 +57,6 @@
+
\ No newline at end of file
diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/navigation/AppNavGraph.kt b/app/src/main/java/com/mob/utsmyanmar/ui/navigation/AppNavGraph.kt
index a66abe4..85a0dff 100644
--- a/app/src/main/java/com/mob/utsmyanmar/ui/navigation/AppNavGraph.kt
+++ b/app/src/main/java/com/mob/utsmyanmar/ui/navigation/AppNavGraph.kt
@@ -19,6 +19,7 @@ import com.mob.utsmyanmar.ui.pinpad.PinPadRoute
import com.mob.utsmyanmar.ui.processing_card.ProcessingCardRoute
import com.mob.utsmyanmar.ui.processing_card.ProcessingCardViewModel
import com.mob.utsmyanmar.ui.print_receipt.PrintReceiptScreen
+import com.mob.utsmyanmar.ui.sending_to_host.SendingToHostRoute
import com.mob.utsmyanmar.ui.transaction_result.TransactionResultRoute
import com.mob.utsmyanmar.viewmodel.CardReaderViewModel
import com.mob.utsmyanmar.viewmodel.EmvTransactionProcessViewModel
@@ -153,8 +154,8 @@ fun AppNavGraph(
pinPadViewModel = pinPadViewModel,
sharedViewModel = sharedViewModel,
transProcessViewModel = transProcessViewModel,
- onNavigateTransactionResult = {
- navController.navigate(Routes.TransactionResult.route) {
+ onNavigateSendingToHost = {
+ navController.navigate(Routes.SendingToHost.route) {
popUpTo(Routes.PinPad.route) {
inclusive = true
}
@@ -165,6 +166,19 @@ fun AppNavGraph(
)
}
+ composable(Routes.SendingToHost.route) {
+ SendingToHostRoute(
+ onNavigateTransactionResult = {
+ navController.navigate(Routes.TransactionResult.route) {
+ popUpTo(Routes.SendingToHost.route) {
+ inclusive = true
+ }
+ launchSingleTop = true
+ }
+ }
+ )
+ }
+
composable(Routes.TransactionResult.route) {
val sharedViewModel: SharedViewModel = hiltViewModel(activity)
diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/navigation/Routes.kt b/app/src/main/java/com/mob/utsmyanmar/ui/navigation/Routes.kt
index 01a0d93..7a69b9f 100644
--- a/app/src/main/java/com/mob/utsmyanmar/ui/navigation/Routes.kt
+++ b/app/src/main/java/com/mob/utsmyanmar/ui/navigation/Routes.kt
@@ -8,6 +8,7 @@ sealed class Routes(val route: String) {
data object CardWaiting : Routes("card_waiting")
data object ProcessingCard : Routes("processing_card")
data object PinPad : Routes("pin_pad")
+ data object SendingToHost : Routes("sending_to_host")
data object TransactionResult : Routes("transaction_result")
data object PrintReceipt : Routes("print_receipt")
}
diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/pinpad/PinPadRoute.kt b/app/src/main/java/com/mob/utsmyanmar/ui/pinpad/PinPadRoute.kt
index 4d6104b..29459fc 100644
--- a/app/src/main/java/com/mob/utsmyanmar/ui/pinpad/PinPadRoute.kt
+++ b/app/src/main/java/com/mob/utsmyanmar/ui/pinpad/PinPadRoute.kt
@@ -17,7 +17,7 @@ fun PinPadRoute(
pinPadViewModel: PinPadViewModel,
sharedViewModel: SharedViewModel,
transProcessViewModel: TransProcessViewModel,
- onNavigateTransactionResult: () -> Unit,
+ onNavigateSendingToHost: () -> Unit,
onBack: () -> Unit
) {
val pinText by pinPadViewModel.pinText.collectAsStateWithLifecycle()
@@ -37,7 +37,7 @@ fun PinPadRoute(
payDetail?.tradeAnswerCode = Constant.ANSWER_CODE_APPROVED
sharedViewModel.payDetail.value = payDetail
transProcessViewModel.resetTransactionStatus()
- onNavigateTransactionResult()
+ onNavigateSendingToHost()
}
PinPadStatus.ON_CANCEL,
diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/print_receipt/PrintReceiptScreen.kt b/app/src/main/java/com/mob/utsmyanmar/ui/print_receipt/PrintReceiptScreen.kt
index 8d4aeb2..4d177de 100644
--- a/app/src/main/java/com/mob/utsmyanmar/ui/print_receipt/PrintReceiptScreen.kt
+++ b/app/src/main/java/com/mob/utsmyanmar/ui/print_receipt/PrintReceiptScreen.kt
@@ -2,6 +2,9 @@ package com.mob.utsmyanmar.ui.print_receipt
import android.util.Log
import androidx.activity.compose.BackHandler
+import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.FastOutSlowInEasing
+import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.*
@@ -15,40 +18,47 @@ import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
-import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.mob.utsmyanmar.ui.components.appbar.AppBar
-import com.mob.utsmyanmar.ui.theme.Primary
-import com.mob.utsmyanmar.ui.theme.White
-import com.utsmyanmar.paylibs.print.NewPrintReceipt
+import com.mob.utsmyanmar.ui.theme.Color
+import com.utsmyanmar.paylibs.print.PrintReceipt
+
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
@Composable
fun PrintReceiptScreen(
onPrint: () -> Unit,
onDone: () -> Unit
) {
- BackHandler {
- onDone()
+
+ val scope = rememberCoroutineScope();
+ val receiptOffsetY = remember {
+ Animatable(0f);
}
+ val animationDuration = 3000;
Scaffold(
topBar = {
AppBar(title = "Receipt")
- }
+ },
+ containerColor = Color.IvoryBeige
) { paddingValues ->
Column(
modifier = Modifier
.padding(paddingValues)
.fillMaxSize()
- .background(Color(0xFFF5F5F5))
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
) {
@@ -57,6 +67,9 @@ fun PrintReceiptScreen(
modifier = Modifier
.weight(1f)
.verticalScroll(rememberScrollState())
+ .graphicsLayer{
+ translationY = receiptOffsetY.value
+ }
)
Spacer(modifier = Modifier.height(16.dp))
@@ -87,18 +100,41 @@ fun PrintReceiptScreen(
.weight(1f)
.height(50.dp),
colors = ButtonDefaults.buttonColors(
- containerColor = Primary,
- contentColor = White,
- disabledContainerColor = Primary,
- disabledContentColor = White,
+ containerColor = Color.LegacyRed,
+ contentColor = Color.White,
+ disabledContainerColor = Color.LegacyRed.copy(alpha = 0.5f),
+ disabledContentColor = Color.White.copy(alpha = 0.5f),
),
shape = RoundedCornerShape(12.dp),
onClick = {
- onPrint()
+// onPrint()
try {
- NewPrintReceipt.getInstance().testPrint()
+ PrintReceipt.getInstance().printNow()
+ scope.launch {
+ launch {
+ receiptOffsetY.animateTo(
+ targetValue = -1500f,
+ animationSpec = tween(
+ durationMillis = animationDuration,
+ easing = FastOutSlowInEasing
+ )
+ )
+ }
+ delay(5000)
+ launch {
+ receiptOffsetY.animateTo(
+ targetValue = 0f,
+ animationSpec = tween(
+ durationMillis = 0,
+ easing = FastOutSlowInEasing
+ )
+ )
+ }
+ }
} catch (e: Exception) {
+
Log.d("PrintReceipt", "error with $e")
+
}
}
) {
@@ -116,6 +152,7 @@ fun PrintReceiptScreen(
}
}
+
@Composable
fun ReceiptPreview(
modifier: Modifier = Modifier
@@ -127,32 +164,26 @@ fun ReceiptPreview(
.background(Color.White)
.border(
width = 1.dp,
- color = Color.LightGray,
+ color = Color.Gray,
shape = RoundedCornerShape(12.dp)
)
.padding(20.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
-
Text(
text = "MOB POS",
fontSize = 24.sp,
fontWeight = FontWeight.Bold,
fontFamily = FontFamily.Monospace
)
-
Spacer(modifier = Modifier.height(8.dp))
-
Text(
text = "Transaction Receipt",
fontSize = 14.sp,
fontFamily = FontFamily.Monospace
)
-
Spacer(modifier = Modifier.height(16.dp))
-
ReceiptDivider()
-
ReceiptRow("Merchant", "MOB UTS Myanmar")
ReceiptRow("Terminal ID", "POS001")
ReceiptRow("Transaction", "SALE")
@@ -163,11 +194,8 @@ fun ReceiptPreview(
ReceiptRow("Date", "13/05/2026")
ReceiptRow("Time", "14:30:22")
ReceiptRow("Ref No", "REF123456789")
-
ReceiptDivider()
-
Spacer(modifier = Modifier.height(8.dp))
-
Text(
text = "Thank You",
fontSize = 16.sp,
@@ -200,7 +228,7 @@ fun ReceiptRow(
text = label,
fontSize = 13.sp,
fontFamily = FontFamily.Monospace,
- color = Color.DarkGray
+ color = Color.Gray
)
Text(
diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostRoute.kt b/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostRoute.kt
new file mode 100644
index 0000000..e1e597e
--- /dev/null
+++ b/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostRoute.kt
@@ -0,0 +1,19 @@
+package com.mob.utsmyanmar.ui.sending_to_host
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import kotlinx.coroutines.delay
+
+private const val MOCK_HOST_DELAY_MS = 2000L
+
+@Composable
+fun SendingToHostRoute(
+ onNavigateTransactionResult: () -> Unit
+) {
+ LaunchedEffect(Unit) {
+ delay(MOCK_HOST_DELAY_MS)
+ onNavigateTransactionResult()
+ }
+
+ SendingToHostScreen()
+}
diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostScreen.kt b/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostScreen.kt
new file mode 100644
index 0000000..441c368
--- /dev/null
+++ b/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostScreen.kt
@@ -0,0 +1,87 @@
+package com.mob.utsmyanmar.ui.sending_to_host
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.CircularProgressIndicator
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.mob.utsmyanmar.ui.theme.Black
+import com.mob.utsmyanmar.ui.theme.Primary
+import com.mob.utsmyanmar.ui.theme.White
+
+@Composable
+fun SendingToHostScreen() {
+ Scaffold(
+ containerColor = White
+ ) { paddingValues ->
+ Column(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(paddingValues)
+ .background(White)
+ .padding(horizontal = 24.dp, vertical = 32.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.Center
+ ) {
+ Box(
+ modifier = Modifier
+ .fillMaxWidth()
+ .background(
+ color = Primary,
+ shape = RoundedCornerShape(24.dp)
+ )
+ .padding(horizontal = 24.dp, vertical = 32.dp),
+ contentAlignment = Alignment.Center
+ ) {
+ Column(
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.Center
+ ) {
+ CircularProgressIndicator(color = White)
+
+ Spacer(modifier = Modifier.height(20.dp))
+
+ Text(
+ text = "Sending Data",
+ color = White,
+ fontSize = 24.sp,
+ fontWeight = FontWeight.Bold
+ )
+
+ Spacer(modifier = Modifier.height(10.dp))
+
+ Text(
+ text = "Please wait while we send transaction data to host.",
+ color = White,
+ fontSize = 15.sp,
+ textAlign = TextAlign.Center
+ )
+ }
+ }
+
+ Spacer(modifier = Modifier.height(24.dp))
+
+ Text(
+ text = "Mock host communication in progress.",
+ color = Black,
+ fontSize = 14.sp,
+ textAlign = TextAlign.Center
+ )
+ }
+ }
+}