Initial import

This commit is contained in:
2026-04-22 22:31:52 +07:00
commit ef756b97a1
71 changed files with 4518 additions and 0 deletions

View File

@ -0,0 +1,139 @@
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() })
}
}
}
}