diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen2.kt b/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen2.kt index ce7ee3f..e14fc09 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen2.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardScreen2.kt @@ -25,14 +25,8 @@ import androidx.compose.material.icons.filled.BarChart import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.ChevronRight import androidx.compose.material.icons.filled.Dashboard -import androidx.compose.material.icons.filled.GridView -import androidx.compose.material.icons.filled.History -import androidx.compose.material.icons.filled.Link import androidx.compose.material.icons.filled.Menu -import androidx.compose.material.icons.filled.PointOfSale -import androidx.compose.material.icons.filled.QrCode import androidx.compose.material.icons.filled.Sync -import androidx.compose.material.icons.filled.Wallet import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.HorizontalDivider @@ -61,7 +55,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow @@ -75,8 +68,6 @@ import com.mob.utsmyanmar.ui.device_info.DeviceInfoViewModel import com.mob.utsmyanmar.ui.preview.P2Preview import com.mob.utsmyanmar.ui.preview.P3Preview import com.mob.utsmyanmar.ui.theme.Color -import com.sunmi.pay.hardware.aidl.AidlConstants -import com.utsmyanmar.baselib.BaseApplication import com.utsmyanmar.paylibs.sign_on.EchoTestProcess import com.utsmyanmar.paylibs.sign_on.SignOnListener import kotlinx.coroutines.delay @@ -88,15 +79,15 @@ fun DashboardScreen2( onNavigateSignOn: () -> Unit = {}, onNavigateSeeMore: () -> Unit = {}, onNavigateSettlement: () -> Unit = {}, - onNavigateVersion:() -> Unit = {}, + onNavigateVersion: () -> Unit = {}, deviceInfoViewModel: DeviceInfoViewModel = viewModel() ) { val deviceInfo by deviceInfoViewModel.uiState.collectAsState() - + LaunchedEffect(Unit) { - deviceInfoViewModel.loadDeviceInfo(); + deviceInfoViewModel.loadDeviceInfo() } - + val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val scope = rememberCoroutineScope() val mainHandler = remember { Handler(Looper.getMainLooper()) } @@ -104,8 +95,8 @@ fun DashboardScreen2( var activeHostAction by remember { mutableStateOf("Log-On") } var isHostActionRunning by remember { mutableStateOf(false) } var dialogMessage by remember { mutableStateOf("") } - - val isOnline = true; + + val isOnline = true fun confirmationMessage(action: String) = "Do you want to start ${action.lowercase()}?" fun processingMessage(action: String) = "Sending ${action.lowercase()} request to host..." @@ -127,18 +118,13 @@ fun DashboardScreen2( if (!isHostActionRunning) { showHostActionDialog = false } - }, - title = { + }, title = { Text( - text = activeHostAction, - color = Color.LegacyRed, - fontWeight = FontWeight.Bold + text = activeHostAction, color = Color.LegacyRed, fontWeight = FontWeight.Bold ) - }, - text = { + }, text = { Text(text = dialogMessage) - }, - confirmButton = { + }, confirmButton = { TextButton( onClick = { if (isHostActionRunning) return@TextButton @@ -159,66 +145,58 @@ fun DashboardScreen2( else -> signOnProcess.enqueueLogOn() } - request - .startSignOn(object : SignOnListener { - override fun onSuccessSignOn() { + request.startSignOn(object : SignOnListener { + override fun onSuccessSignOn() { + mainHandler.post { + isHostActionRunning = false + dialogMessage = successMessage(activeHostAction) + } + } + + override fun onFailureSignOn(resultCode: Int?) { + mainHandler.post { + isHostActionRunning = false mainHandler.post { isHostActionRunning = false - dialogMessage = successMessage(activeHostAction) + dialogMessage = failureMessage(activeHostAction, resultCode) } } + } - override fun onFailureSignOn(resultCode: Int?) { - mainHandler.post { - isHostActionRunning = false - mainHandler.post { - isHostActionRunning = false - dialogMessage = - failureMessage(activeHostAction, resultCode) - } - } + + override fun onNetworkFailSignOn(message: String?) { + mainHandler.post { + isHostActionRunning = false + dialogMessage = message?.takeIf { it.isNotBlank() } + ?: networkFailureMessage(activeHostAction) } - - - override fun onNetworkFailSignOn(message: String?) { - mainHandler.post { - isHostActionRunning = false - dialogMessage = message?.takeIf { it.isNotBlank() } - ?: networkFailureMessage(activeHostAction) - } - } - }) - } - ) { + } + }) + }) { Text( text = when { isHostActionRunning -> "Processing" dialogMessage == confirmationMessage(activeHostAction) -> "Start" else -> "Close" - }, - color = Color.LegacyRed + }, color = Color.LegacyRed ) } - }, - dismissButton = { + }, dismissButton = { if (!isHostActionRunning) { TextButton( onClick = { showHostActionDialog = false dialogMessage = confirmationMessage(activeHostAction) - } - ) { + }) { Text(text = "Cancel", color = Color.Gray) } } - }, - containerColor = Color.White + }, containerColor = Color.White ) } ModalNavigationDrawer( - drawerState = drawerState, - drawerContent = { + drawerState = drawerState, drawerContent = { ModalDrawerSheet( modifier = Modifier.fillMaxWidth(0.78f), drawerContainerColor = Color.White, @@ -230,13 +208,12 @@ fun DashboardScreen2( .background(Color.IvoryBeige) .padding(horizontal = 20.dp, vertical = 28.dp) ) { - Row() { + Row { Box( modifier = Modifier .size(80.dp) .clip(CircleShape) - .background(Color.White), - contentAlignment = Alignment.Center + .background(Color.White), contentAlignment = Alignment.Center ) { Image( painter = painterResource(R.drawable.logo_mob), @@ -248,7 +225,7 @@ fun DashboardScreen2( ) } - Column() { + Column { Text( text = "MOB Merchant", color = Color.CrimsonRed, @@ -262,8 +239,8 @@ fun DashboardScreen2( fontWeight = FontWeight.Bold ) Text( - text = if(isOnline) "Online" else "Offline", - color = if(isOnline) Color.Success else Color.Error, + text = if (isOnline) "Online" else "Offline", + color = if (isOnline) Color.Success else Color.Error, fontSize = 12.sp, fontWeight = FontWeight.Bold ) @@ -291,40 +268,56 @@ fun DashboardScreen2( modifier = Modifier.padding(horizontal = 16.dp) ) DrawerItem("Function", Icons.Default.Dashboard) { - scope.launch { drawerState.close()} + scope.launch { drawerState.close() } } DrawerItem("Version", Icons.Default.Dashboard) { - scope.launch { drawerState.close()} - onNavigateVersion(); + scope.launch { drawerState.close() } + onNavigateVersion() } } - } - ) { + }) { Scaffold( - containerColor = Color.IvoryBeige, - topBar = { + containerColor = Color.IvoryBeige, topBar = { AppBar( title = "Dashboard", icon = Icons.Default.Menu, - onIconClick = { scope.launch { drawerState.open() } } - ) - } - ) { paddingValues -> + onIconClick = { scope.launch { drawerState.open() } }) + }) { paddingValues -> Column( modifier = Modifier .padding(paddingValues) .fillMaxSize() -// .padding(horizontal = 16.dp) ) { - AdvertisingArea() - SummaryCard() - Spacer(modifier = Modifier.height(16.dp)) - MenuGrid( - onNavigateAmount = onNavigateAmount, - onNavigateSignOn = onNavigateSignOn, - onNavigateSeeMore = onNavigateSeeMore, - onNavigateSettlement = onNavigateSettlement - ) + //top section + Box( + modifier = Modifier + .weight(1f) + .fillMaxWidth(), + ) { + AdvertisingArea() + } + //center section + Box( + modifier = Modifier + .weight(1f) + .fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + SummaryCard() + } + //bottom section + Box( + modifier = Modifier + .weight(1.5f) + .fillMaxWidth(), + ) { + MenuGrid( + onNavigateAmount = onNavigateAmount, + onNavigateSignOn = onNavigateSignOn, + onNavigateSeeMore = onNavigateSeeMore, + onNavigateSettlement = onNavigateSettlement + ) + } } } } @@ -332,23 +325,19 @@ fun DashboardScreen2( @Composable private fun DrawerItem( - title: String, - icon: ImageVector, - onClick: () -> Unit + title: String, icon: ImageVector, onClick: () -> Unit ) { NavigationDrawerItem( label = { Text( - text = title, - fontWeight = FontWeight.Medium + text = title, fontWeight = FontWeight.Medium ) }, selected = false, onClick = onClick, icon = { Icon( - imageVector = icon, - contentDescription = title + imageVector = icon, contentDescription = title ) }, modifier = Modifier.padding(horizontal = 12.dp, vertical = 2.dp), @@ -367,32 +356,27 @@ private fun AdvertisingArea() { "https://i.ytimg.com/vi/eRUVxGRp1Ms/maxresdefault.jpg", "https://i.ytimg.com/vi/AwvmgTPd7qw/maxresdefault.jpg", "https://mma.prnewswire.com/media/2080956/SUNMI_3rd_generation_products_T3_PRO_series_V3_MIX.jpg?p=facebook" - ); + ) val pageState = rememberPagerState(pageCount = { imageArray.size }) LaunchedEffect(pageState) { while (true) { delay(10000) - val nextPage = (pageState.currentPage + 1) % imageArray.size; + val nextPage = (pageState.currentPage + 1) % imageArray.size pageState.animateScrollToPage( - page = nextPage, - animationSpec = tween(durationMillis = 700) + page = nextPage, animationSpec = tween(durationMillis = 700) ) } } Card( - modifier = Modifier - .fillMaxWidth() - .height(170.dp), + modifier = Modifier.fillMaxSize(), shape = RoundedCornerShape(0.dp), colors = CardDefaults.cardColors(containerColor = Color.White), ) { HorizontalPager( - state = pageState, - modifier = Modifier - .fillMaxSize() + state = pageState, modifier = Modifier.fillMaxSize() ) { page -> AsyncImage( model = imageArray[page], @@ -448,8 +432,7 @@ private fun SummaryCard() { ) { Row(verticalAlignment = Alignment.Bottom) { Text( - text = "Last Sync", - fontSize = 12.sp + text = "Last Sync", fontSize = 12.sp ) IconCircle(Icons.Default.Sync, Color.CrimsonRed) } @@ -476,16 +459,12 @@ private fun SummaryItem( iconBg: androidx.compose.ui.graphics.Color ) { Row( - verticalAlignment = Alignment.Top, - modifier = Modifier.padding(6.dp) + verticalAlignment = Alignment.Top, modifier = Modifier.padding(6.dp) ) { Column(modifier = Modifier.weight(1f)) { Text(title, fontSize = 12.sp) Text( - value, - fontSize = 14.sp, - color = Color.LegacyRed, - fontWeight = FontWeight.Bold + value, fontSize = 14.sp, color = Color.LegacyRed, fontWeight = FontWeight.Bold ) Text(subtitle, fontSize = 12.sp) } @@ -495,8 +474,7 @@ private fun SummaryItem( @Composable private fun IconCircle( - icon: ImageVector, - color: androidx.compose.ui.graphics.Color + icon: ImageVector, color: androidx.compose.ui.graphics.Color ) { Box( modifier = Modifier @@ -525,35 +503,63 @@ private fun MenuGrid( verticalArrangement = Arrangement.spacedBy(10.dp), modifier = Modifier.padding(horizontal = 16.dp) ) { + Spacer(Modifier.height(8.dp)) Row(horizontalArrangement = Arrangement.spacedBy(10.dp)) { - MenuCard( - title = "Sale", - icon = Icons.Default.PointOfSale, - modifier = Modifier.weight(1f), - onClick = { onNavigateAmount("Sale") } - ) - MenuCard("MMQR", Icons.Default.QrCode, Modifier.weight(1f)) - MenuCard("History", Icons.Default.History, Modifier.weight(1f)) + MenuCard(title = "Sale", icon = { + Icon( + painterResource(R.drawable.ic_terminal), + contentDescription = "icon", + modifier = Modifier.size(40.dp), + tint = Color.LegacyRed + ) + }, modifier = Modifier.weight(1f), onClick = { onNavigateAmount("Sale") }) + MenuCard(title = "MMQR", icon = { + Image( + painter = painterResource(R.drawable.ic_mmqr_logo), + contentDescription = "mmqr image", + modifier = Modifier.height(48.dp) + ) + }, modifier = Modifier.weight(1f)) + MenuCard("History", icon = { + Icon( + painterResource(R.drawable.ic_history), + contentDescription = "icon", + modifier = Modifier.size(32.dp), + tint = Color.LegacyRed + ) + }, modifier = Modifier.weight(1f)) } Row(horizontalArrangement = Arrangement.spacedBy(10.dp)) { MenuCard( - "Sign On", - Icons.Default.Link, - Modifier.weight(1f), - onClick = onNavigateSignOn + title = "Sign On", icon = { + Icon( + painterResource(R.drawable.ic_sign_on), + contentDescription = "icon", + modifier = Modifier.size(32.dp), + tint = Color.LegacyRed + ) + }, modifier = Modifier.weight(1f), onClick = onNavigateSignOn ) MenuCard( - "Settlement", - Icons.Default.Wallet, - Modifier.weight(1f), - onClick = onNavigateSettlement + title = "Settlement", icon = { + Icon( + painterResource(R.drawable.ic_settlement), + contentDescription = "icon", + modifier = Modifier.size(32.dp), + tint = Color.LegacyRed + ) + }, modifier = Modifier.weight(1f), onClick = onNavigateSettlement ) MenuCard( - "See More", - Icons.Default.GridView, - Modifier.weight(1f), - onClick = onNavigateSeeMore + title = "See More", icon = { + Icon( + painterResource(R.drawable.ic_see_more), + contentDescription = "icon", + modifier = Modifier.size(32.dp), + tint = Color.LegacyRed + ) + }, modifier = Modifier.weight(1f), onClick = onNavigateSeeMore ) } } @@ -562,7 +568,7 @@ private fun MenuGrid( @Composable private fun MenuCard( title: String, - icon: ImageVector, + icon: @Composable () -> Unit, modifier: Modifier = Modifier, onClick: (() -> Unit)? = null ) { @@ -586,13 +592,7 @@ private fun MenuCard( .padding(6.dp) ) { Column { - Icon( - imageVector = icon, - contentDescription = title, - tint = Color.LegacyRed, - modifier = Modifier.size(50.dp) - ) - + icon() Spacer(modifier = Modifier.weight(1f)) Row( diff --git a/app/src/main/res/drawable/ic_history.xml b/app/src/main/res/drawable/ic_history.xml new file mode 100644 index 0000000..805faa9 --- /dev/null +++ b/app/src/main/res/drawable/ic_history.xml @@ -0,0 +1,24 @@ + + + + diff --git a/app/src/main/res/drawable/ic_mmqr_logo.xml b/app/src/main/res/drawable/ic_mmqr_logo.xml new file mode 100644 index 0000000..fd3abd5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mmqr_logo.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_see_more.xml b/app/src/main/res/drawable/ic_see_more.xml new file mode 100644 index 0000000..9319397 --- /dev/null +++ b/app/src/main/res/drawable/ic_see_more.xml @@ -0,0 +1,64 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_settlement.xml b/app/src/main/res/drawable/ic_settlement.xml new file mode 100644 index 0000000..3e8c587 --- /dev/null +++ b/app/src/main/res/drawable/ic_settlement.xml @@ -0,0 +1,24 @@ + + + + diff --git a/app/src/main/res/drawable/ic_sign_on.xml b/app/src/main/res/drawable/ic_sign_on.xml new file mode 100644 index 0000000..d57c975 --- /dev/null +++ b/app/src/main/res/drawable/ic_sign_on.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_terminal.xml b/app/src/main/res/drawable/ic_terminal.xml new file mode 100644 index 0000000..83e8344 --- /dev/null +++ b/app/src/main/res/drawable/ic_terminal.xml @@ -0,0 +1,24 @@ + + + +