Merge branch 'cz' into new_dev

This commit is contained in:
moon 2026-06-26 13:57:41 +06:30
commit 90a3f1f744
2 changed files with 74 additions and 221 deletions

View File

@ -1,63 +1,52 @@
package com.mob.utsmyanmar.ui.navigation package com.mob.utsmyanmar.ui.navigation
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.net.Uri
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.NavType import androidx.navigation.NavType
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.navArgument import androidx.navigation.navArgument
import com.mob.utsmyanmar.model.ProcessCode import com.mob.utsmyanmar.model.ProcessCode
import com.mob.utsmyanmar.ui.input_amount.AmountRoute
import com.mob.utsmyanmar.ui.cardwaiting.CardWaitingScreen import com.mob.utsmyanmar.ui.cardwaiting.CardWaitingScreen
import com.mob.utsmyanmar.ui.cardwaiting.CardWaitingViewModel import com.mob.utsmyanmar.ui.cardwaiting.CardWaitingViewModel
import com.mob.utsmyanmar.ui.dashboard.DashboardScreen2 import com.mob.utsmyanmar.ui.dashboard.DashboardScreen2
import com.mob.utsmyanmar.ui.dashboard.DashboardViewModel import com.mob.utsmyanmar.ui.dashboard.SeeMoreScreen
import com.mob.utsmyanmar.ui.device_info.DeviceInfoViewModel import com.mob.utsmyanmar.ui.device_info.DeviceInfoViewModel
import com.mob.utsmyanmar.ui.disable.DisableScreen
import com.mob.utsmyanmar.ui.functions.FunctionsScreen
import com.mob.utsmyanmar.ui.history_functions.HistoryRoute
import com.mob.utsmyanmar.ui.input_amount.AmountRoute
import com.mob.utsmyanmar.ui.manual_entry.InputManualCardRoute
import com.mob.utsmyanmar.ui.notification.NotificationDetailScreen
import com.mob.utsmyanmar.ui.notification.NotificationListScreen
import com.mob.utsmyanmar.ui.notification.NotificationViewModel
import com.mob.utsmyanmar.ui.password_input.InputPassword
import com.mob.utsmyanmar.ui.password_input.PasswordType
import com.mob.utsmyanmar.ui.pinpad.PinPadRoute import com.mob.utsmyanmar.ui.pinpad.PinPadRoute
import com.mob.utsmyanmar.ui.pinpad.PinPadViewModel
import com.mob.utsmyanmar.ui.print_receipt.PrintReceiptScreen
import com.mob.utsmyanmar.ui.processing_card.ProcessingCardRoute 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.print_receipt.PrintReceiptScreen
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.sale_void.TranDetailPage
import com.mob.utsmyanmar.ui.sale_void.VoidTraceScreen
import com.mob.utsmyanmar.ui.sale_void.VoidViewModel
import com.mob.utsmyanmar.ui.sending_to_host.ProcessingRoute
import com.mob.utsmyanmar.ui.settlement.SettlementScreen
import com.mob.utsmyanmar.ui.settlement.SettlementViewModel
import com.mob.utsmyanmar.ui.sign_on.SignOnResultScreen import com.mob.utsmyanmar.ui.sign_on.SignOnResultScreen
import com.mob.utsmyanmar.ui.sign_on.SignOnRoute import com.mob.utsmyanmar.ui.sign_on.SignOnRoute
import com.mob.utsmyanmar.ui.tms_setup.TmsSetupRoute import com.mob.utsmyanmar.ui.sending_to_host.ProcessingRoute
import com.mob.utsmyanmar.ui.tms_setup.TmsSetupViewModel import com.mob.utsmyanmar.ui.settlement.SettlementScreen
import com.mob.utsmyanmar.ui.transaction_result.TransactionResultEvent
import com.mob.utsmyanmar.ui.transaction_result.TransactionResultRoute import com.mob.utsmyanmar.ui.transaction_result.TransactionResultRoute
import com.mob.utsmyanmar.ui.transaction_result.TransactionResultViewModel import com.mob.utsmyanmar.ui.sale_void.TranDetailPage
import com.mob.utsmyanmar.ui.version.VersionScreen import com.mob.utsmyanmar.ui.sale_void.VoidViewModel
import com.mob.utsmyanmar.ui.sale_void.VoidTraceScreen
import com.mob.utsmyanmar.viewmodel.CardReaderViewModel import com.mob.utsmyanmar.viewmodel.CardReaderViewModel
import com.mob.utsmyanmar.viewmodel.EmvTransactionProcessViewModel import com.mob.utsmyanmar.viewmodel.EmvTransactionProcessViewModel
import com.mob.utsmyanmar.ui.pinpad.PinPadViewModel
import com.mob.utsmyanmar.ui.settlement.SettlementViewModel
import com.mob.utsmyanmar.ui.transaction_result.TransactionResultEvent
import com.mob.utsmyanmar.ui.transaction_result.TransactionResultViewModel
import com.mob.utsmyanmar.ui.functions.FunctionsScreen
import com.mob.utsmyanmar.ui.refund_rrn.RRNViewModel
import com.mob.utsmyanmar.ui.tms_setup.TmsSetupRoute
import com.mob.utsmyanmar.ui.tms_setup.TmsSetupViewModel
import com.mob.utsmyanmar.ui.version.VersionScreen
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.ecr.data.TransType
import com.utsmyanmar.paylibs.model.TradeData import com.utsmyanmar.paylibs.model.TradeData
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType
import sunmi.sunmiui.utils.LogUtil
@SuppressLint("ContextCastToActivity") @SuppressLint("ContextCastToActivity")
@Composable @Composable
@ -76,31 +65,9 @@ fun AppNavGraph(
viewModel = tmsSetupViewModel, viewModel = tmsSetupViewModel,
onNavigateDashboard = { onNavigateDashboard = {
navController.navigate(Routes.Dashboard.route) { navController.navigate(Routes.Dashboard.route) {
popUpTo(Routes.TmsSetup.route) { inclusive = true } popUpTo(Routes.TmsSetup.route) {
launchSingleTop = true inclusive = true
} }
},
onNavigateDisable = { message ->
navController.navigate(Routes.Disable.createRoute(message)) {
popUpTo(Routes.TmsSetup.route) { inclusive = true }
launchSingleTop = true
}
}
)
}
composable(
route = Routes.Disable.route,
arguments = listOf(
navArgument("message") { type = NavType.StringType }
)
) { backStackEntry ->
val message = Uri.decode(backStackEntry.arguments?.getString("message").orEmpty())
DisableScreen(
message = message,
onRetry = {
navController.navigate(Routes.TmsSetup.route) {
popUpTo(Routes.Disable.route) { inclusive = true }
launchSingleTop = true launchSingleTop = true
} }
} }
@ -109,28 +76,10 @@ fun AppNavGraph(
composable(Routes.Dashboard.route) { composable(Routes.Dashboard.route) {
val sharedViewModel: SharedViewModel = hiltViewModel(activity) val sharedViewModel: SharedViewModel = hiltViewModel(activity)
val dashboardViewModel: DashboardViewModel = hiltViewModel() val transProcessViewModel: TransProcessViewModel = hiltViewModel(activity)
val dashboardUiState by dashboardViewModel.uiState.collectAsStateWithLifecycle()
val deviceInfoViewModel: DeviceInfoViewModel = hiltViewModel() transProcessViewModel.resetTransactionStatus()
val deviceInfo by deviceInfoViewModel.uiState.collectAsStateWithLifecycle()
val tmsSetupViewModel: TmsSetupViewModel = hiltViewModel()
androidx.compose.runtime.LaunchedEffect(Unit) { deviceInfoViewModel.loadDeviceInfo() }
androidx.compose.runtime.LaunchedEffect(tmsSetupViewModel) {
tmsSetupViewModel.onSyncCompleted.collect {
dashboardViewModel.refreshLastSyncTime()
dashboardViewModel.loadCarouselUrls()
}
}
androidx.compose.runtime.LaunchedEffect(tmsSetupViewModel) {
tmsSetupViewModel.navigateToDisable.collect { message ->
navController.navigate(Routes.Disable.createRoute(message)) {
launchSingleTop = true
}
}
}
DashboardScreen2( DashboardScreen2(
dashboardUiState = dashboardUiState,
deviceInfo = deviceInfo,
onNavigateAmount = { action -> onNavigateAmount = { action ->
if(action == "Sale"){ if(action == "Sale"){
sharedViewModel.transactionsType.value = TransactionsType.SALE; sharedViewModel.transactionsType.value = TransactionsType.SALE;
@ -146,6 +95,11 @@ fun AppNavGraph(
launchSingleTop = true launchSingleTop = true
} }
}, },
onNavigateSeeMore = {
navController.navigate(Routes.SeeMore.route) {
launchSingleTop = true
}
},
onNavigateSettlement = { onNavigateSettlement = {
navController.navigate(Routes.Settlement.route) { navController.navigate(Routes.Settlement.route) {
launchSingleTop = true launchSingleTop = true
@ -155,47 +109,41 @@ fun AppNavGraph(
navController.navigate(Routes.Version.route) navController.navigate(Routes.Version.route)
}, },
onNavigateFunctions = { onNavigateFunctions = {
navController.navigate(Routes.Password.createRoute(Routes.Functions.route, PasswordType.SETTING)) { navController.navigate(Routes.Functions.route) {
launchSingleTop = true launchSingleTop = true
} }
},
onNavigateHistory = {
navController.navigate(Routes.Password.createRoute(Routes.History.route, PasswordType.SYSTEM)) {
launchSingleTop = true
}
},
onNavigateAction = { action ->
when (action) {
"Void" -> {
sharedViewModel.transactionsType.value = TransactionsType.VOID
navController.navigate(Routes.Password.createRoute(Routes.VoidTrace.route, PasswordType.SYSTEM)) {
launchSingleTop = true
}
}
"Pre-Auth Void" -> navController.navigate(Routes.Password.createRoute(Routes.Amount.createRoute(action), PasswordType.SYSTEM)) {
launchSingleTop = true
}
"Pre-Auth Complete Void" -> {
sharedViewModel.transactionsType.value = TransactionsType.PRE_AUTH_COMPLETE_VOID
navController.navigate(Routes.Password.createRoute(Routes.VoidTrace.route, PasswordType.SYSTEM)) {
launchSingleTop = true
}
}
"Refund" -> navController.navigate(Routes.Password.createRoute(Routes.Amount.createRoute(action), PasswordType.SYSTEM)) {
launchSingleTop = true
}
else -> navController.navigate(Routes.Amount.createRoute(action)) { launchSingleTop = true }
}
},
onNavigateNotifications = {
navController.navigate(Routes.NotificationList.route) { launchSingleTop = true }
},
onClickLastSync = {
tmsSetupViewModel.downloadConfigs()
} }
) )
} }
composable(Routes.SeeMore.route) {
val sharedViewModel: SharedViewModel = hiltViewModel(activity)
SeeMoreScreen(
onBack = { navController.popBackStack() },
onNavigateAmount = { action ->
when (action) {
"Void" -> {
sharedViewModel.transactionsType.value = TransactionsType.VOID
navController.navigate(Routes.VoidTrace.route) {
launchSingleTop = true
}
}
"Pre-Auth Complete Void" -> {
sharedViewModel.transactionsType.value = TransactionsType.PRE_AUTH_COMPLETE_VOID
navController.navigate(Routes.VoidTrace.route) {
launchSingleTop = true
}
}
else -> {
navController.navigate(Routes.Amount.createRoute(action)) {
launchSingleTop = true
}
}
}
}
)
}
composable(Routes.Version.route){ composable(Routes.Version.route){
val deviceInfoViewModel: DeviceInfoViewModel = hiltViewModel(); val deviceInfoViewModel: DeviceInfoViewModel = hiltViewModel();
VersionScreen( VersionScreen(
@ -204,57 +152,18 @@ fun AppNavGraph(
) )
} }
composable(
route = Routes.Password.route,
arguments = listOf(
navArgument("destination") { type = NavType.StringType },
navArgument("passwordType") { type = NavType.StringType }
)
) { backStackEntry ->
val destination = Uri.decode(backStackEntry.arguments?.getString("destination").orEmpty())
val passwordType = backStackEntry.arguments?.getString("passwordType").orEmpty()
InputPassword(
passwordType = passwordType,
onBack = { navController.popBackStack() },
onPasswordCorrect = {
navController.navigate(destination) {
popUpTo(Routes.Password.route) { inclusive = true }
launchSingleTop = true
}
}
)
}
composable(Routes.Functions.route) { composable(Routes.Functions.route) {
FunctionsScreen( FunctionsScreen(
onBack = { navController.popBackStack() } onBack = { navController.popBackStack() }
) )
} }
composable(Routes.History.route) {
val sharedViewModel: SharedViewModel = hiltViewModel(activity)
val transResultViewModel: TransactionResultViewModel = hiltViewModel(activity)
HistoryRoute(
sharedViewModel = sharedViewModel,
onBack = { navController.popBackStack() },
onNavigatePrintReceipt = {
transResultViewModel.onEvent(
TransactionResultEvent.Start,
sharedViewModel
)
navController.navigate(Routes.PrintReceipt.route) {
launchSingleTop = true
}
}
)
}
composable(Routes.VoidTrace.route) { composable(Routes.VoidTrace.route) {
val voidViewModel: VoidViewModel = hiltViewModel() val voidViewModel: VoidViewModel = hiltViewModel()
val sharedViewModel: SharedViewModel = hiltViewModel(activity) val sharedViewModel: SharedViewModel = hiltViewModel(activity)
VoidTraceScreen( VoidTraceScreen(
voidViewModel = voidViewModel,
sharedViewModel = sharedViewModel, sharedViewModel = sharedViewModel,
voidViewModel = voidViewModel,
onNavigateTranDetail = { trace -> onNavigateTranDetail = { trace ->
navController.navigate(Routes.VoidTranDetail.createRoute(trace)) { navController.navigate(Routes.VoidTranDetail.createRoute(trace)) {
launchSingleTop = true launchSingleTop = true
@ -311,6 +220,7 @@ fun AppNavGraph(
payDetail.transType = TransactionsType.PRE_AUTH_COMPLETE_VOID.name payDetail.transType = TransactionsType.PRE_AUTH_COMPLETE_VOID.name
payDetail.transactionType = TransactionsType.PRE_AUTH_COMPLETE_VOID.value payDetail.transactionType = TransactionsType.PRE_AUTH_COMPLETE_VOID.value
} }
val tradeData = TradeData() val tradeData = TradeData()
tradeData.payDetail = payDetail tradeData.payDetail = payDetail
transProcessViewModel.setTradeData(tradeData) transProcessViewModel.setTradeData(tradeData)
@ -414,14 +324,7 @@ fun AppNavGraph(
CardWaitingScreen( CardWaitingScreen(
viewModel = cardWaitingViewModel, viewModel = cardWaitingViewModel,
amount = formatAmountForDisplay(sharedViewModel.amount.value), amount = formatAmountForDisplay(sharedViewModel.amount.value),
onManualEntry = { onManualEntry = {},
navController.navigate(Routes.ManualEntry.route) {
popUpTo(Routes.CardWaiting.route) {
inclusive = true
}
launchSingleTop = true
}
},
onProcessingCard = { onProcessingCard = {
navController.navigate(Routes.ProcessingCard.route) { navController.navigate(Routes.ProcessingCard.route) {
popUpTo(Routes.CardWaiting.route) { popUpTo(Routes.CardWaiting.route) {
@ -517,11 +420,11 @@ fun AppNavGraph(
composable(Routes.InputRrn.route) { composable(Routes.InputRrn.route) {
val sharedViewModel: SharedViewModel = hiltViewModel(activity) val sharedViewModel: SharedViewModel = hiltViewModel(activity)
val transProcessViewModel: TransProcessViewModel = hiltViewModel(activity)
val rrnViewModel: RRNViewModel = hiltViewModel(activity) val rrnViewModel: RRNViewModel = hiltViewModel(activity)
val transProcessViewModel: TransProcessViewModel = hiltViewModel(activity)
InputRrnRoute( InputRrnRoute(
rrnViewModel = rrnViewModel,
transProcessViewModel = transProcessViewModel, transProcessViewModel = transProcessViewModel,
rrnViewModel = rrnViewModel,
sharedViewModel = sharedViewModel, sharedViewModel = sharedViewModel,
onBack = { navController.popBackStack() }, onBack = { navController.popBackStack() },
onNavigateProcessing = { onNavigateProcessing = {
@ -535,27 +438,6 @@ fun AppNavGraph(
) )
} }
composable(Routes.ManualEntry.route) {
val sharedViewModel: SharedViewModel = hiltViewModel(activity)
val transProcessViewModel: TransProcessViewModel = hiltViewModel(activity)
val pinPadViewModel: PinPadViewModel = hiltViewModel(activity)
InputManualCardRoute(
transProcessViewModel = transProcessViewModel,
sharedViewModel = sharedViewModel,
pinPadViewModel = pinPadViewModel,
onBack = { navController.popBackStack() },
onNavigatePinPad = {
pinPadViewModel.resetSessionState()
navController.navigate(Routes.PinPad.route) {
popUpTo(Routes.ProcessingCard.route) {
inclusive = true
}
launchSingleTop = true
}
},
)
}
composable(Routes.Processing.route) { composable(Routes.Processing.route) {
val sharedViewModel: SharedViewModel = hiltViewModel(activity) val sharedViewModel: SharedViewModel = hiltViewModel(activity)
val transProcessViewModel: TransProcessViewModel = hiltViewModel(activity) val transProcessViewModel: TransProcessViewModel = hiltViewModel(activity)
@ -633,34 +515,6 @@ fun AppNavGraph(
} }
) )
} }
composable(Routes.NotificationList.route) {
val notificationViewModel: NotificationViewModel = hiltViewModel()
NotificationListScreen(
viewModel = notificationViewModel,
onBack = { navController.popBackStack() },
onNavigateDetail = { id ->
navController.navigate(Routes.NotificationDetail.createRoute(id)) {
launchSingleTop = true
}
}
)
}
composable(
route = Routes.NotificationDetail.route,
arguments = listOf(
navArgument("notificationId") { type = NavType.IntType }
)
) { backStackEntry ->
val notificationViewModel: NotificationViewModel = hiltViewModel()
val id = backStackEntry.arguments?.getInt("notificationId") ?: return@composable
NotificationDetailScreen(
viewModel = notificationViewModel,
notificationId = id,
onBack = { navController.popBackStack() }
)
}
} }
} }

View File

@ -8,12 +8,15 @@ import com.mob.utsmyanmar.viewmodel.SharedViewModel
import com.mob.utsmyanmar.viewmodel.TransProcessViewModel import com.mob.utsmyanmar.viewmodel.TransProcessViewModel
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import com.mob.utsmyanmar.ui.transaction_result.TransactionResultState
import androidx.compose.runtime.setValue import com.mob.utsmyanmar.viewmodel.ProcessingTransaction
import androidx.compose.runtime.saveable.rememberSaveable import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import androidx.compose.runtime.collectAsState
import com.mob.utsmyanmar.model.TransactionStatus import com.mob.utsmyanmar.model.TransactionStatus
import com.mob.utsmyanmar.ui.settlement.SettlementViewModel import com.mob.utsmyanmar.ui.settlement.SettlementViewModel
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType
import kotlinx.coroutines.channels.Channel
private const val MOCK_HOST_DELAY_MS = 2000L private const val MOCK_HOST_DELAY_MS = 2000L
@ -32,7 +35,6 @@ fun ProcessingRoute(
val settlementStatus by settlementViewModel.uiState.collectAsStateWithLifecycle() val settlementStatus by settlementViewModel.uiState.collectAsStateWithLifecycle()
if(sharedViewModel.transactionsType.value == TransactionsType.SETTLEMENT) { if(sharedViewModel.transactionsType.value == TransactionsType.SETTLEMENT) {
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
settlementViewModel.startSettlementProcess() settlementViewModel.startSettlementProcess()
@ -50,6 +52,7 @@ fun ProcessingRoute(
} }
} else { } else {
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
// transProcessViewModel.resetTransactionStatus()
transProcessViewModel.startOnlineProcess() transProcessViewModel.startOnlineProcess()
} }
@ -64,15 +67,10 @@ fun ProcessingRoute(
sharedViewModel.payDetail.value = transProcessViewModel.payDetailResult.value sharedViewModel.payDetail.value = transProcessViewModel.payDetailResult.value
onNavigateTransactionResult() onNavigateTransactionResult()
} }
TransResultStatus.REVERSAL_SUCCESS , TransResultStatus.REVERSAL_SUCCESS -> onNavigateMain()
TransResultStatus.REVERSAL_FAIL -> { TransResultStatus.REVERSAL_FAIL -> onNavigateMain()
delay(2500)
onNavigateMain()
}
else -> {} else -> {}
} }
} }
} }
@ -81,6 +79,7 @@ fun ProcessingRoute(
if(sharedViewModel.transactionsType.value == TransactionsType.SETTLEMENT) { if(sharedViewModel.transactionsType.value == TransactionsType.SETTLEMENT) {
ProcessingScreen(settlementStatus.processingState) ProcessingScreen(settlementStatus.processingState)
} else { } else {