version screen

This commit is contained in:
moon 2026-05-27 16:55:59 +06:30
parent f80c7c5d1b
commit 4aebd825d2
8 changed files with 252 additions and 4 deletions

View File

@ -42,6 +42,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import com.mob.utsmyanmar.ui.components.appbar.AppBar import com.mob.utsmyanmar.ui.components.appbar.AppBar
import com.mob.utsmyanmar.ui.preview.P2Preview import com.mob.utsmyanmar.ui.preview.P2Preview
import com.mob.utsmyanmar.ui.preview.P3Preview
import com.mob.utsmyanmar.ui.theme.Color import com.mob.utsmyanmar.ui.theme.Color
@Composable @Composable
@ -338,7 +339,13 @@ private fun appendAmountValue(current: String, value: String): String {
@P2Preview @P2Preview
@Composable @Composable
fun PreviewAmountScreen() { fun PreviewAmountScreen2() {
AmountScreen { }
}
@P3Preview
@Composable
fun PreviewAmountScreen3() {
AmountScreen { } AmountScreen { }
} }

View File

@ -73,6 +73,7 @@ import com.mob.utsmyanmar.R
import com.mob.utsmyanmar.ui.components.appbar.AppBar import com.mob.utsmyanmar.ui.components.appbar.AppBar
import com.mob.utsmyanmar.ui.device_info.DeviceInfoViewModel import com.mob.utsmyanmar.ui.device_info.DeviceInfoViewModel
import com.mob.utsmyanmar.ui.preview.P2Preview import com.mob.utsmyanmar.ui.preview.P2Preview
import com.mob.utsmyanmar.ui.preview.P3Preview
import com.mob.utsmyanmar.ui.theme.Color import com.mob.utsmyanmar.ui.theme.Color
import com.sunmi.pay.hardware.aidl.AidlConstants import com.sunmi.pay.hardware.aidl.AidlConstants
import com.utsmyanmar.baselib.BaseApplication import com.utsmyanmar.baselib.BaseApplication
@ -87,6 +88,7 @@ fun DashboardScreen2(
onNavigateSignOn: () -> Unit = {}, onNavigateSignOn: () -> Unit = {},
onNavigateSeeMore: () -> Unit = {}, onNavigateSeeMore: () -> Unit = {},
onNavigateSettlement: () -> Unit = {}, onNavigateSettlement: () -> Unit = {},
onNavigateVersion:() -> Unit = {},
deviceInfoViewModel: DeviceInfoViewModel = viewModel() deviceInfoViewModel: DeviceInfoViewModel = viewModel()
) { ) {
val deviceInfo by deviceInfoViewModel.uiState.collectAsState() val deviceInfo by deviceInfoViewModel.uiState.collectAsState()
@ -283,6 +285,18 @@ fun DashboardScreen2(
scope.launch { drawerState.close() } scope.launch { drawerState.close() }
openHostActionDialog("Log-Off") openHostActionDialog("Log-Off")
} }
Text(
text = "System Management",
fontWeight = FontWeight.Medium,
modifier = Modifier.padding(horizontal = 16.dp)
)
DrawerItem("Function", Icons.Default.Dashboard) {
scope.launch { drawerState.close()}
}
DrawerItem("Version", Icons.Default.Dashboard) {
scope.launch { drawerState.close()}
onNavigateVersion();
}
} }
} }
) { ) {
@ -610,3 +624,9 @@ private fun MenuCard(
fun PreviewDashboardScreen2() { fun PreviewDashboardScreen2() {
DashboardScreen2() DashboardScreen2()
} }
@P3Preview
@Composable
fun PreviewDashboardScreen3() {
DashboardScreen2()
}

View File

@ -6,6 +6,8 @@ data class DeviceInfoUiState(
val serialNumber: String = "", val serialNumber: String = "",
val deviceModel: String = "", val deviceModel: String = "",
val finalVersion: String = "", val finalVersion: String = "",
val payHardwareVersion: String = "",
val romVersion: String = "",
val isLoading: Boolean = false, val isLoading: Boolean = false,
val errorMessage: String? = null val errorMessage: String? = null
) )

View File

@ -6,9 +6,10 @@ import com.utsmyanmar.baselib.BaseApplication
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import sunmi.sunmiui.utils.LogUtil
class DeviceInfoViewModel : ViewModel() { class DeviceInfoViewModel : ViewModel() {
var TAG = DeviceInfoViewModel::class.simpleName;
private val _uiState = MutableStateFlow(DeviceInfoUiState()) private val _uiState = MutableStateFlow(DeviceInfoUiState())
val uiState = _uiState.asStateFlow() val uiState = _uiState.asStateFlow()
@ -21,6 +22,9 @@ class DeviceInfoViewModel : ViewModel() {
val serialNo = getParams(AidlConstants.SysParam.SN) val serialNo = getParams(AidlConstants.SysParam.SN)
val deviceModel = getParams(AidlConstants.SysParam.DEVICE_MODEL) val deviceModel = getParams(AidlConstants.SysParam.DEVICE_MODEL)
val finalVersion = SystemParamsOperation.getInstance().finalVersion ?: "" val finalVersion = SystemParamsOperation.getInstance().finalVersion ?: ""
val payHardwareVersion = getPayHardwareVersion()
val romVersion = getRomVersion()
_uiState.value = DeviceInfoUiState( _uiState.value = DeviceInfoUiState(
hardwareVersion = hardwareVersion, hardwareVersion = hardwareVersion,
@ -28,6 +32,8 @@ class DeviceInfoViewModel : ViewModel() {
serialNumber = serialNo, serialNumber = serialNo,
deviceModel = deviceModel, deviceModel = deviceModel,
finalVersion = finalVersion, finalVersion = finalVersion,
payHardwareVersion = payHardwareVersion,
romVersion = romVersion,
isLoading = false isLoading = false
) )
@ -49,4 +55,25 @@ class DeviceInfoViewModel : ViewModel() {
"" ""
} }
} }
private fun getPayHardwareVersion():String {
return try {
BaseApplication.getInstance().applicationContext.packageManager.getPackageInfo(
"com.sunmi.pay.hardware_v3",
0
).versionName ?: "PHV?"
} catch (e: Exception) {
e.printStackTrace()
"PHV?"
}
}
private fun getRomVersion():String {
return try {
android.os.Build.VERSION.RELEASE ?: "UNKNOWN"
}catch (e: Exception){
LogUtil.d(TAG, "get rom version error " + e)
"UNKNOWN"
}
}
} }

View File

@ -17,6 +17,7 @@ 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.SeeMoreScreen import com.mob.utsmyanmar.ui.dashboard.SeeMoreScreen
import com.mob.utsmyanmar.ui.device_info.DeviceInfoViewModel
import com.mob.utsmyanmar.ui.pinpad.PinPadRoute import com.mob.utsmyanmar.ui.pinpad.PinPadRoute
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
@ -33,6 +34,7 @@ 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.pinpad.PinPadViewModel
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.paylibs.utils.iso_utils.TransactionsType import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType
@ -75,6 +77,9 @@ fun AppNavGraph(
navController.navigate(Routes.Settlement.route) { navController.navigate(Routes.Settlement.route) {
launchSingleTop = true launchSingleTop = true
} }
},
onNavigateVersion = {
navController.navigate(Routes.Version.route);
} }
) )
} }
@ -95,6 +100,14 @@ fun AppNavGraph(
} }
) )
} }
composable(Routes.Version.route){
val deviceInfoViewModel: DeviceInfoViewModel = hiltViewModel();
VersionScreen(
onBack = {navController.popBackStack()},
deviceInfoViewModel = deviceInfoViewModel
)
}
composable(Routes.VoidTrace.route) { composable(Routes.VoidTrace.route) {
val voidViewModel: VoidViewModel = hiltViewModel() val voidViewModel: VoidViewModel = hiltViewModel()

View File

@ -26,4 +26,5 @@ sealed class Routes(val route: String) {
data object Processing : Routes("processing") data object Processing : Routes("processing")
data object TransactionResult : Routes("transaction_result") data object TransactionResult : Routes("transaction_result")
data object PrintReceipt : Routes("print_receipt") data object PrintReceipt : Routes("print_receipt")
data object Version : Routes("version")
} }

View File

@ -13,7 +13,8 @@ annotation class P2Preview
@Preview( @Preview(
name = "P3", name = "P3",
device = "spec:width=720px,height=1440px,dpi=320", device = "spec:width=720px,height=1600px,dpi=320",
showBackground = true showBackground = true,
showSystemUi = true
) )
annotation class P3Preview annotation class P3Preview

View File

@ -0,0 +1,177 @@
package com.mob.utsmyanmar.ui.version
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.Row
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.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ChevronLeft
import androidx.compose.material.icons.filled.Square
import androidx.compose.material3.Card
import androidx.compose.material3.CardColors
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.viewmodel.compose.viewModel
import com.mob.utsmyanmar.ui.components.appbar.AppBar
import com.mob.utsmyanmar.ui.device_info.DeviceInfoViewModel
import com.mob.utsmyanmar.ui.preview.P3Preview
import com.mob.utsmyanmar.ui.theme.Color
@Composable
fun VersionScreen(
onBack: () -> Unit,
deviceInfoViewModel: DeviceInfoViewModel
) {
val deviceInfo by deviceInfoViewModel.uiState.collectAsState();
val itemSpace = 20.dp;
LaunchedEffect(Unit) {
deviceInfoViewModel.loadDeviceInfo();
}
Scaffold(
topBar = {
AppBar(
title = "Version",
onIconClick = onBack,
icon = Icons.Default.ChevronLeft
)
},
containerColor = Color.IvoryBeige
)
{ paddingValues ->
Column(
modifier = Modifier
.padding(paddingValues)
.fillMaxSize()
.padding(16.dp)
) {
Text("Device Information")
Spacer(Modifier.height(16.dp))
Card(
colors = CardDefaults.cardColors(
containerColor = Color.White
)
) {
Column(
modifier = Modifier.padding(16.dp),
) {
Item(
title = "PROD NAME",
value = deviceInfo.deviceModel,
icon = Icons.Default.Square
)
Spacer(Modifier.height(itemSpace))
Item(
title = "TERMINAL SERIAL",
value = deviceInfo.serialNumber,
icon = Icons.Default.Square
)
Spacer(Modifier.height(itemSpace))
Item(
title = "HARDWARE VER",
value = deviceInfo.hardwareVersion,
icon = Icons.Default.Square
)
Spacer(Modifier.height(itemSpace))
Item(
title = "FIRMWARE VER",
value = deviceInfo.firmwareVersion,
icon = Icons.Default.Square
)
Spacer(Modifier.height(itemSpace))
Item(
title = "S/W VER",
value = deviceInfo.finalVersion,
icon = Icons.Default.Square
)
Spacer(Modifier.height(itemSpace))
Item(
title = "PAYHARDWARE SERVICE VER",
value = deviceInfo.payHardwareVersion,
icon = Icons.Default.Square
)
Spacer(Modifier.height(itemSpace))
Item(
title = "ROM VER",
value = deviceInfo.romVersion,
icon = Icons.Default.Square
)
}
}
}
}
}
@Composable
fun Item(
title: String,
value: String,
icon: ImageVector
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Row(
modifier = Modifier.weight(1.4f),
horizontalArrangement = Arrangement.spacedBy(12.dp),
verticalAlignment = Alignment.CenterVertically
) {
Box(
modifier = Modifier.size(40.dp).background(
color = Color.CrimsonRed.copy(alpha = 0.2f),
shape = CircleShape
),
contentAlignment = Alignment.Center
){
Icon(
imageVector = icon,
contentDescription = "icon"
)
}
Text(text = title)
}
Row(
modifier = Modifier.weight(1f),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween
) {
Text(text = ":")
Text(text = value)
}
}
}
@P3Preview
@Composable
fun P3PreviewVersionScreen() {
VersionScreen(
onBack = {},
deviceInfoViewModel = hiltViewModel()
)
}