140 lines
5.8 KiB
Kotlin
140 lines
5.8 KiB
Kotlin
package com.iiyh.emoneyinfo.ui
|
|
|
|
import android.content.Context
|
|
import androidx.compose.foundation.layout.padding
|
|
import androidx.compose.material.icons.Icons
|
|
import androidx.compose.material.icons.filled.CreditCard
|
|
import androidx.compose.material.icons.filled.Settings
|
|
import androidx.compose.material3.Icon
|
|
import androidx.compose.material3.NavigationBar
|
|
import androidx.compose.material3.NavigationBarItem
|
|
import androidx.compose.material3.Scaffold
|
|
import androidx.compose.material3.Text
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.collectAsState
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.runtime.mutableStateOf
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.runtime.setValue
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.platform.LocalContext
|
|
import androidx.compose.ui.res.stringResource
|
|
import com.iiyh.emoneyinfo.R
|
|
import androidx.navigation.NavDestination.Companion.hierarchy
|
|
import androidx.navigation.compose.NavHost
|
|
import androidx.navigation.compose.composable
|
|
import androidx.navigation.compose.currentBackStackEntryAsState
|
|
import androidx.navigation.compose.rememberNavController
|
|
import com.iiyh.emoneyinfo.nfc.UnifiedNfcReader
|
|
import com.iiyh.emoneyinfo.ui.screens.AboutScreen
|
|
import com.iiyh.emoneyinfo.ui.screens.FaqScreen
|
|
import com.iiyh.emoneyinfo.ui.screens.HomeScreen
|
|
import com.iiyh.emoneyinfo.ui.screens.HistoryScreen
|
|
import com.iiyh.emoneyinfo.ui.screens.PrivacyPolicyScreen
|
|
import com.iiyh.emoneyinfo.ui.screens.SettingsScreen
|
|
import com.iiyh.emoneyinfo.ui.screens.TermsScreen
|
|
|
|
private data class BottomDestination(val route: String, val label: String)
|
|
|
|
@Composable
|
|
fun EmoneyInfoApp(
|
|
nfcReader: UnifiedNfcReader,
|
|
adsEnabled: Boolean
|
|
) {
|
|
val context = LocalContext.current
|
|
val navController = rememberNavController()
|
|
val uiState by nfcReader.uiState.collectAsState()
|
|
val preferences = remember(context) {
|
|
context.getSharedPreferences("emoney_info_prefs", Context.MODE_PRIVATE)
|
|
}
|
|
var showCardNumber by remember(preferences) {
|
|
mutableStateOf(preferences.getBoolean("masked", true))
|
|
}
|
|
|
|
val bottomDestinations = listOf(
|
|
BottomDestination("home", stringResource(R.string.tab_home)),
|
|
BottomDestination("settings", stringResource(R.string.tab_settings))
|
|
)
|
|
|
|
Scaffold(
|
|
bottomBar = {
|
|
val navBackStackEntry by navController.currentBackStackEntryAsState()
|
|
val currentDestination = navBackStackEntry?.destination
|
|
val visible = currentDestination?.route in setOf("home", "settings")
|
|
if (visible) {
|
|
NavigationBar {
|
|
bottomDestinations.forEach { destination ->
|
|
NavigationBarItem(
|
|
selected = currentDestination?.hierarchy?.any { it.route == destination.route } == true,
|
|
onClick = {
|
|
if (destination.route == "home") {
|
|
navController.popBackStack("home", false)
|
|
} else {
|
|
navController.navigate(destination.route) {
|
|
launchSingleTop = true
|
|
}
|
|
}
|
|
},
|
|
icon = {
|
|
Icon(
|
|
imageVector = if (destination.route == "home") Icons.Default.CreditCard else Icons.Default.Settings,
|
|
contentDescription = destination.label
|
|
)
|
|
},
|
|
label = { Text(destination.label) }
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
) { innerPadding ->
|
|
NavHost(navController = navController, startDestination = "home", modifier = Modifier.padding(innerPadding)) {
|
|
composable("home") {
|
|
HomeScreen(
|
|
state = uiState,
|
|
adsEnabled = adsEnabled,
|
|
showCardNumber = showCardNumber,
|
|
onScanTapped = { nfcReader.startScan() },
|
|
onViewHistoryTapped = { navController.navigate("history") },
|
|
onSettingsTapped = { navController.navigate("settings") }
|
|
)
|
|
}
|
|
composable("settings") {
|
|
SettingsScreen(
|
|
adsEnabled = adsEnabled,
|
|
showCardNumber = showCardNumber,
|
|
onShowCardNumberChanged = {
|
|
showCardNumber = it
|
|
preferences.edit().putBoolean("masked", it).apply()
|
|
},
|
|
onHelpCenterTapped = { navController.navigate("faq") },
|
|
onAboutTapped = { navController.navigate("about") }
|
|
)
|
|
}
|
|
composable("history") {
|
|
HistoryScreen(
|
|
state = uiState,
|
|
adsEnabled = adsEnabled,
|
|
onBack = { navController.popBackStack() }
|
|
)
|
|
}
|
|
composable("faq") {
|
|
FaqScreen(onBack = { navController.popBackStack() })
|
|
}
|
|
composable("about") {
|
|
AboutScreen(
|
|
onBack = { navController.popBackStack() },
|
|
onTermsTapped = { navController.navigate("terms") },
|
|
onPrivacyTapped = { navController.navigate("privacy") }
|
|
)
|
|
}
|
|
composable("terms") {
|
|
TermsScreen(onBack = { navController.popBackStack() })
|
|
}
|
|
composable("privacy") {
|
|
PrivacyPolicyScreen(onBack = { navController.popBackStack() })
|
|
}
|
|
}
|
|
}
|
|
}
|