diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/amount/AmountRoute.kt b/app/src/main/java/com/mob/utsmyanmar/ui/amount/AmountRoute.kt new file mode 100644 index 0000000..8da4882 --- /dev/null +++ b/app/src/main/java/com/mob/utsmyanmar/ui/amount/AmountRoute.kt @@ -0,0 +1,31 @@ +package com.mob.utsmyanmar.ui.amount + +import androidx.compose.runtime.Composable +import com.mob.utsmyanmar.model.ProcessCode +import com.mob.utsmyanmar.viewmodel.SharedViewModel +import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType + +@Composable +fun AmountRoute( + action: String, + sharedViewModel: SharedViewModel, + onBack: () -> Unit, + onNavigateCardWaiting: () -> Unit +) { + AmountScreen( + action = action, + onBackClick = onBack, + onCancelClick = onBack, + onNextClick = { amount -> + sharedViewModel.amount.value = amount + sharedViewModel.setAmountExist(true) + sharedViewModel.setCardDataExist(false) + sharedViewModel.setTransMenu(null) + sharedViewModel.transactionsType.value = TransactionsType.SALE + sharedViewModel.processCode.value = + ProcessCode.SALE_PURCHASE + ProcessCode.SMART + ProcessCode.TO_ACCOUNT + + onNavigateCardWaiting() + } + ) +} diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardRoute.kt b/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardRoute.kt new file mode 100644 index 0000000..3623e0c --- /dev/null +++ b/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardRoute.kt @@ -0,0 +1,16 @@ +package com.mob.utsmyanmar.ui.dashboard + +import androidx.compose.runtime.Composable + +@Composable +fun DashboardRoute( + onNavigateAmount: (String) -> Unit, + settlementEnabled: Boolean, + wavePayEnabled: Boolean, +) { + DashboardScreen( + settlementEnabled = settlementEnabled, + wavePayEnabled = wavePayEnabled, + onNavigateAmount = onNavigateAmount + ) +} diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen.kt b/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen.kt index ffe2e73..e279088 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen.kt @@ -29,17 +29,11 @@ import com.mob.utsmyanmar.ui.components.appbar.AppBar fun DashboardScreen( settlementEnabled: Boolean, wavePayEnabled: Boolean, - onAmountClick: (String) -> Unit, - onTransactionClick: () -> Unit, - onSettlementClick: () -> Unit, - onHistoryClick: () -> Unit, - onCardClick: () -> Unit, - onWavePayClick: () -> Unit + onNavigateAmount: (String) -> Unit ) { val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val scope = rememberCoroutineScope() - ModalNavigationDrawer( drawerState = drawerState, drawerContent = { @@ -71,7 +65,6 @@ fun DashboardScreen( .fillMaxWidth() .clickable { scope.launch { drawerState.close() } - onTransactionClick() } .padding(horizontal = 24.dp, vertical = 14.dp), fontSize = 16.sp @@ -82,7 +75,6 @@ fun DashboardScreen( .fillMaxWidth() .clickable { scope.launch { drawerState.close() } - onHistoryClick() } .padding(horizontal = 24.dp, vertical = 14.dp), fontSize = 16.sp @@ -93,7 +85,6 @@ fun DashboardScreen( .fillMaxWidth() .clickable(enabled = settlementEnabled) { scope.launch { drawerState.close() } - onSettlementClick() } .padding(horizontal = 24.dp, vertical = 14.dp), color = if (settlementEnabled) Black else White, @@ -105,7 +96,6 @@ fun DashboardScreen( .fillMaxWidth() .clickable(enabled = wavePayEnabled) { scope.launch { drawerState.close() } - onWavePayClick() } .padding(horizontal = 24.dp, vertical = 14.dp), color = if (wavePayEnabled) Black else White, @@ -176,7 +166,7 @@ fun DashboardScreen( contentColor = Primary, iconTint = Primary, border = null, - onClick = { onAmountClick("Sale") }, + onClick = { onNavigateAmount("Sale") }, ) SquareButton( title = "Sign On", @@ -186,7 +176,7 @@ fun DashboardScreen( contentColor = Primary, iconTint = Primary, border = null, - onClick = { onAmountClick("Sign On") } + onClick = { onNavigateAmount("Sign On") } ) } @@ -203,7 +193,7 @@ fun DashboardScreen( contentColor = Primary, iconTint = Primary, border = null, - onClick = onSettlementClick + onClick = {} ) SquareButton( title = "Others", @@ -213,7 +203,7 @@ fun DashboardScreen( contentColor = Primary, iconTint = Primary, border = null, - onClick = onCardClick + onClick = {} ) } } @@ -230,12 +220,7 @@ private fun DashboardScreenPreview() { DashboardScreen( settlementEnabled = true, wavePayEnabled = true, - onAmountClick = {}, - onTransactionClick = {}, - onSettlementClick = {}, - onHistoryClick = {}, - onCardClick = {}, - onWavePayClick = {} + onNavigateAmount = {} ) } } 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 aa86cec..4f930b4 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 @@ -1,5 +1,6 @@ package com.mob.utsmyanmar.ui.navigation +import android.annotation.SuppressLint import androidx.activity.ComponentActivity import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext @@ -10,11 +11,10 @@ import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.navArgument -import com.mob.utsmyanmar.model.ProcessCode -import com.mob.utsmyanmar.ui.amount.AmountScreen +import com.mob.utsmyanmar.ui.amount.AmountRoute import com.mob.utsmyanmar.ui.cardwaiting.CardWaitingScreen import com.mob.utsmyanmar.ui.cardwaiting.CardWaitingViewModel -import com.mob.utsmyanmar.ui.dashboard.DashboardScreen +import com.mob.utsmyanmar.ui.dashboard.DashboardRoute import com.mob.utsmyanmar.ui.pinpad.PinPadRoute import com.mob.utsmyanmar.ui.processing_card.ProcessingCardRoute import com.mob.utsmyanmar.ui.processing_card.ProcessingCardViewModel @@ -25,8 +25,8 @@ import com.mob.utsmyanmar.viewmodel.EmvTransactionProcessViewModel import com.mob.utsmyanmar.ui.pinpad.PinPadViewModel import com.mob.utsmyanmar.viewmodel.SharedViewModel import com.mob.utsmyanmar.viewmodel.TransProcessViewModel -import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType +@SuppressLint("ContextCastToActivity") @Composable fun AppNavGraph( navController: NavHostController @@ -38,17 +38,12 @@ fun AppNavGraph( startDestination = Routes.Dashboard.route ) { composable(Routes.Dashboard.route) { - DashboardScreen( - settlementEnabled = true, - wavePayEnabled = true, - onAmountClick = { action -> + DashboardRoute( + onNavigateAmount = { action -> navController.navigate(Routes.Amount.createRoute(action)) }, - onTransactionClick = {}, - onSettlementClick = {}, - onHistoryClick = {}, - onCardClick = {}, - onWavePayClick = {} + settlementEnabled = true, + wavePayEnabled = true ) } @@ -62,21 +57,11 @@ fun AppNavGraph( ) { backStackEntry -> val sharedViewModel: SharedViewModel = hiltViewModel(activity) - AmountScreen( + AmountRoute( action = backStackEntry.arguments?.getString("action").orEmpty(), - onBackClick = { navController.popBackStack() }, - onCancelClick = { navController.popBackStack() }, - onNextClick = { amount -> - sharedViewModel.amount.value = amount - sharedViewModel.setAmountExist(true) - sharedViewModel.setCardDataExist(false) - sharedViewModel.setTransMenu(null) - sharedViewModel.transactionsType.value = TransactionsType.SALE - sharedViewModel.processCode.value = - ProcessCode.SALE_PURCHASE + ProcessCode.SMART + ProcessCode.TO_ACCOUNT - - navController.navigate(Routes.CardWaiting.route) - } + sharedViewModel = sharedViewModel, + onBack = { navController.popBackStack() }, + onNavigateCardWaiting = { navController.navigate(Routes.CardWaiting.route) } ) } @@ -189,6 +174,7 @@ fun AppNavGraph( composable(Routes.PrintReceipt.route) { PrintReceiptScreen( + onPrint = {}, onDone = { navController.navigate(Routes.Dashboard.route) { popUpTo(Routes.Dashboard.route) { 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 badc699..04029ab 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 @@ -1,63 +1,230 @@ package com.mob.utsmyanmar.ui.print_receipt -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding +import android.util.Log +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton 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.draw.clip +import androidx.compose.ui.graphics.Color +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.utsmyanmar.paylibs.print.PrintReceipt @Composable fun PrintReceiptScreen( + onPrint: () -> Unit, onDone: () -> Unit ) { Scaffold( topBar = { - AppBar(title = "Print Receipt") + AppBar(title = "Receipt") } ) { paddingValues -> + Column( modifier = Modifier .padding(paddingValues) .fillMaxSize() + .background(Color(0xFFF5F5F5)) .padding(16.dp), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { - Text( - text = "Print Receipt", - style = MaterialTheme.typography.titleLarge.copy( - fontSize = 24.sp, - fontWeight = FontWeight.SemiBold - ) + + ReceiptPreview( + modifier = Modifier + .weight(1f) + .verticalScroll(rememberScrollState()) ) - Button( - modifier = Modifier - .fillMaxWidth() - .padding(top = 24.dp), - onClick = onDone + Spacer(modifier = Modifier.height(16.dp)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(12.dp) ) { - Text(text = "Back to Dashboard") + + OutlinedButton( + onClick = {}, + modifier = Modifier + .weight(1f) + .height(50.dp), + shape = RoundedCornerShape(12.dp) + ) { + Text( + text = "Cancel", + style = MaterialTheme.typography.bodyLarge.copy( + fontSize = 16.sp, + fontWeight = FontWeight.SemiBold + ) + ) + } + + Button( + modifier = Modifier + .weight(1f) + .height(50.dp), + colors = ButtonDefaults.buttonColors( + containerColor = Primary, + contentColor = White, + disabledContainerColor = Primary, + disabledContentColor = White, + ), + shape = RoundedCornerShape(12.dp), + onClick = { try { + NewPrintReceipt.getInstance().testPrint() + }catch (e: Exception){ + Log.d("PrintReceipt", "error with $e") + } } + ) { + Text( + text = "Print", + style = MaterialTheme.typography.bodyLarge.copy( + fontSize = 16.sp, + fontWeight = FontWeight.SemiBold + ) + ) + } } + } } } +@Composable +fun ReceiptPreview( + modifier: Modifier = Modifier +) { + Column( + modifier = modifier + .fillMaxWidth() + .clip(RoundedCornerShape(12.dp)) + .background(Color.White) + .border( + width = 1.dp, + color = Color.LightGray, + 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") + ReceiptRow("Amount", "500.00 MMK") + ReceiptRow("Card Type", "MPU") + ReceiptRow("Card No", "1234 **** **** 5678") + ReceiptRow("Status", "SUCCESS") + 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, + fontWeight = FontWeight.SemiBold, + fontFamily = FontFamily.Monospace + ) + + Spacer(modifier = Modifier.height(4.dp)) + + Text( + text = "Please keep this receipt", + fontSize = 12.sp, + fontFamily = FontFamily.Monospace + ) + } +} + +@Composable +fun ReceiptRow( + label: String, + value: String +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 6.dp), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = label, + fontSize = 13.sp, + fontFamily = FontFamily.Monospace, + color = Color.DarkGray + ) + + Text( + text = value, + fontSize = 13.sp, + fontWeight = FontWeight.SemiBold, + fontFamily = FontFamily.Monospace + ) + } +} + +@Composable +fun ReceiptDivider() { + Text( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 10.dp), + text = "--------------------------------", + fontFamily = FontFamily.Monospace, + color = Color.Gray + ) +} + @Preview(showBackground = true, showSystemUi = true) @Composable fun PreviewPrintReceiptScreen() { - PrintReceiptScreen { } -} - + MaterialTheme { + PrintReceiptScreen( + onPrint = {}, + onDone = {} + ) + } +} \ No newline at end of file diff --git a/baselib/build.gradle b/baselib/build.gradle index 424ca20..0c37240 100644 --- a/baselib/build.gradle +++ b/baselib/build.gradle @@ -75,6 +75,7 @@ dependencies { implementation project(path: ':sunmiui-lib') // implementation 'com.sunmi:printerlibrary:1.0.9' implementation 'com.sunmi:printerlibrary:1.0.23' + implementation 'com.sunmi:printerx:1.0.17' //RxJava implementation 'io.reactivex.rxjava3:rxandroid:3.0.0' diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/BaseApplication.java b/baselib/src/main/java/com/utsmyanmar/baselib/BaseApplication.java index 1efb57b..4546131 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/BaseApplication.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/BaseApplication.java @@ -98,7 +98,7 @@ public class BaseApplication extends Application { mPinPadOptV2 = sunmiPayKernel.mPinPadOptV2; mReadCardOptV2 = sunmiPayKernel.mReadCardOptV2; mSecurityOptV2 = sunmiPayKernel.mSecurityOptV2; - + PayLibsUtils.getInstance().initPrinterX(); PayLibsUtils.getInstance().initLib(mSecurityOptV2,mEMVOptV2,securityOpt,mReadCardOptV2); SunmiSDK.getInstance().initSDK(mReadCardOptV2,basicOptV2); diff --git a/paylibs/build.gradle b/paylibs/build.gradle index 92bdcd5..72a5f0c 100644 --- a/paylibs/build.gradle +++ b/paylibs/build.gradle @@ -66,6 +66,7 @@ dependencies { // implementation 'com.sunmi:printerlibrary:1.0.9' implementation 'com.sunmi:printerlibrary:1.0.24' + implementation 'com.sunmi:printerx:1.0.17' //paySDK // implementation project(path:':PayLib-release-1.4.58') implementation project(path: ':sunmiui-lib') diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/PayLibsUtils.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/PayLibsUtils.java index 360442c..dbc0d69 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/PayLibsUtils.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/PayLibsUtils.java @@ -7,6 +7,12 @@ import com.sunmi.pay.hardware.aidlv2.emv.EMVOptV2; import com.sunmi.pay.hardware.aidlv2.readcard.ReadCardOptV2; import com.sunmi.pay.hardware.aidlv2.security.SecurityOptV2; import com.sunmi.peripheral.printer.SunmiPrinterService; +import com.sunmi.printerx.PrinterSdk; +import com.sunmi.printerx.SdkException; + +import java.util.List; + +import sunmi.sunmiui.utils.LogUtil; public class PayLibsUtils { @@ -23,6 +29,8 @@ public class PayLibsUtils { public SecurityOpt securityOpt; public ReadCardOptV2 readCardOptV2; + + public PrinterSdk.Printer printer; private PayLibsUtils(){} @@ -49,8 +57,21 @@ public class PayLibsUtils { this.readCardOptV2 = readCardOptV2; } + public void initPrinterX() throws SdkException { + PrinterSdk.getInstance().getPrinter( + context, + new PrinterSdk.PrinterListen() { + @Override + public void onDefPrinter(PrinterSdk.Printer defPrinter) { + LogUtil.d("PayLibsUtils", "init printer : " + defPrinter); + printer = defPrinter; + } + @Override + public void onPrinters(List list) { - - + } + } + ); + } } diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/NewPrintReceipt.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/NewPrintReceipt.java new file mode 100644 index 0000000..9314783 --- /dev/null +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/NewPrintReceipt.java @@ -0,0 +1,35 @@ +package com.utsmyanmar.paylibs.print; + +import com.sunmi.printerx.PrinterSdk; +import com.sunmi.printerx.SdkException; +import com.sunmi.printerx.style.TextStyle; + +public class NewPrintReceipt { + + private static NewPrintReceipt instance; + + private PrinterSdk.Printer printer; + + private NewPrintReceipt() {} + + public static synchronized NewPrintReceipt getInstance() { + if (instance == null) { + instance = new NewPrintReceipt(); + } + return instance; + } + + public void setPrinter(PrinterSdk.Printer printer) { + this.printer = printer; + } + + public void testPrint() throws SdkException { + + if (printer == null) { + return; + } + + printer.lineApi().addText("testing", TextStyle.getStyle()); + printer.lineApi().autoOut(); + } +} \ No newline at end of file diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/PrintReceipt.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/PrintReceipt.java index ecb9aad..8942235 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/PrintReceipt.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/PrintReceipt.java @@ -75,6 +75,8 @@ public class PrintReceipt { bitmap = BitmapFactory.decodeResource(resources, R.drawable.primary_print_logo_yoma_bank, opts); } + + public void clearQueue() throws RemoteException {