package com.craigvg.lichun_android.ui.screens.settings import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.* import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import android.content.Context import android.content.Intent import android.net.Uri import androidx.hilt.navigation.compose.hiltViewModel import com.craigvg.lichun_android.BuildConfig import com.craigvg.lichun_android.ui.theme.AppColors import com.craigvg.lichun_android.ui.theme.AppSpacing import com.craigvg.lichun_android.ui.theme.AppTypography import com.craigvg.lichun_android.viewmodel.GameStateViewModel /** * Settings screen with various app options */ @OptIn(ExperimentalMaterial3Api::class) @Composable fun SettingsScreen( gameStateViewModel: GameStateViewModel = hiltViewModel(), onBack: () -> Unit = {}, onDataExport: () -> Unit = {}, onAccountDeletion: () -> Unit = {}, onAchievements: () -> Unit = {}, onDailyRewards: () -> Unit = {}, onDailyQuests: () -> Unit = {}, onProfile: () -> Unit = {}, onDebugTools: () -> Unit = {} ) { val context = LocalContext.current val prefs = remember { context.getSharedPreferences("baolife_settings", Context.MODE_PRIVATE) } var soundEnabled by remember { mutableStateOf(prefs.getBoolean("soundEnabled", true)) } var hapticEnabled by remember { mutableStateOf(prefs.getBoolean("hapticEnabled", true)) } var notificationsEnabled by remember { mutableStateOf(prefs.getBoolean("notificationsEnabled", true)) } Scaffold( topBar = { TopAppBar( title = { Text("Settings", style = AppTypography.headline) }, navigationIcon = { IconButton(onClick = onBack) { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Back", tint = AppColors.primaryText ) } }, colors = TopAppBarDefaults.topAppBarColors( containerColor = AppColors.surfaceElevated ) ) }, containerColor = AppColors.background ) { paddingValues -> LazyColumn( modifier = Modifier .fillMaxSize() .padding(paddingValues), contentPadding = PaddingValues(AppSpacing.md), verticalArrangement = Arrangement.spacedBy(AppSpacing.md) ) { // Account Section item { SettingsSection(title = "Account") { SettingsRow( icon = Icons.Default.Person, title = "Profile", subtitle = "View your character details", onClick = onProfile ) HorizontalDivider(color = AppColors.surfaceSubtle) SettingsRow( icon = Icons.Default.Download, title = "Export Data", subtitle = "Request a copy of your data (GDPR)", onClick = onDataExport ) HorizontalDivider(color = AppColors.surfaceSubtle) SettingsRow( icon = Icons.Default.DeleteForever, title = "Delete Account", subtitle = "Permanently delete your account", onClick = onAccountDeletion, isDestructive = true ) } } // Game Features Section item { SettingsSection(title = "Game Features") { SettingsRow( icon = Icons.Default.EmojiEvents, title = "Achievements", subtitle = "View your unlocked achievements", onClick = onAchievements ) HorizontalDivider(color = AppColors.surfaceSubtle) SettingsRow( icon = Icons.Default.CardGiftcard, title = "Daily Rewards", subtitle = "Claim your daily login rewards", onClick = onDailyRewards ) HorizontalDivider(color = AppColors.surfaceSubtle) SettingsRow( icon = Icons.Default.Assignment, title = "Daily Quests", subtitle = "Complete quests for rewards", onClick = onDailyQuests ) } } // Preferences Section item { SettingsSection(title = "Preferences") { SettingsToggleRow( icon = Icons.Default.VolumeUp, title = "Sound Effects", subtitle = "Enable game sounds", isEnabled = soundEnabled, onToggle = { soundEnabled = it; prefs.edit().putBoolean("soundEnabled", it).apply() } ) HorizontalDivider(color = AppColors.surfaceSubtle) SettingsToggleRow( icon = Icons.Default.Vibration, title = "Haptic Feedback", subtitle = "Enable vibration feedback", isEnabled = hapticEnabled, onToggle = { hapticEnabled = it; prefs.edit().putBoolean("hapticEnabled", it).apply() } ) HorizontalDivider(color = AppColors.surfaceSubtle) SettingsToggleRow( icon = Icons.Default.Notifications, title = "Push Notifications", subtitle = "Receive game notifications", isEnabled = notificationsEnabled, onToggle = { notificationsEnabled = it; prefs.edit().putBoolean("notificationsEnabled", it).apply() } ) } } // Developer Tools Section item { SettingsSection(title = "Developer Tools") { SettingsRow( icon = Icons.Default.Build, title = "Debug Tools", subtitle = "Grant money, energy, and diamonds", onClick = onDebugTools ) } } // About Section item { SettingsSection(title = "About") { SettingsRow( icon = Icons.Default.Info, title = "Version", subtitle = "${BuildConfig.VERSION_NAME} (Build ${BuildConfig.VERSION_CODE})", onClick = {} ) HorizontalDivider(color = AppColors.surfaceSubtle) SettingsRow( icon = Icons.Default.Policy, title = "Privacy Policy", subtitle = "View our privacy policy", onClick = { context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://lichun.app/privacy"))) } ) HorizontalDivider(color = AppColors.surfaceSubtle) SettingsRow( icon = Icons.Default.Description, title = "Terms of Service", subtitle = "View terms and conditions", onClick = { context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://lichun.app/terms"))) } ) } } // Spacer at bottom item { Spacer(modifier = Modifier.height(AppSpacing.xl)) } } } } @Composable private fun SettingsSection( title: String, content: @Composable ColumnScope.() -> Unit ) { Column { Text( text = title.uppercase(), style = AppTypography.captionBold, color = AppColors.secondaryText, modifier = Modifier.padding(bottom = AppSpacing.xs) ) Card( shape = RoundedCornerShape(AppSpacing.cornerRadius), colors = CardDefaults.cardColors( containerColor = AppColors.surfaceElevated ), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp) ) { Column( modifier = Modifier.padding(vertical = AppSpacing.xs), content = content ) } } } @Composable private fun SettingsRow( icon: ImageVector, title: String, subtitle: String, onClick: () -> Unit, isDestructive: Boolean = false ) { Row( modifier = Modifier .fillMaxWidth() .clickable(onClick = onClick) .padding(horizontal = AppSpacing.md, vertical = AppSpacing.sm), verticalAlignment = Alignment.CenterVertically ) { Box( modifier = Modifier .size(40.dp) .clip(CircleShape) .background( if (isDestructive) AppColors.error.copy(alpha = 0.1f) else AppColors.primary.copy(alpha = 0.1f) ), contentAlignment = Alignment.Center ) { Icon( imageVector = icon, contentDescription = null, tint = if (isDestructive) AppColors.error else AppColors.primary, modifier = Modifier.size(20.dp) ) } Spacer(modifier = Modifier.width(AppSpacing.sm)) Column(modifier = Modifier.weight(1f)) { Text( text = title, style = AppTypography.body, color = if (isDestructive) AppColors.error else AppColors.primaryText ) Text( text = subtitle, style = AppTypography.caption, color = AppColors.secondaryText ) } Icon( imageVector = Icons.Default.ChevronRight, contentDescription = null, tint = AppColors.disabledText, modifier = Modifier.size(20.dp) ) } } @Composable private fun SettingsToggleRow( icon: ImageVector, title: String, subtitle: String, isEnabled: Boolean, onToggle: (Boolean) -> Unit ) { Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = AppSpacing.md, vertical = AppSpacing.sm), verticalAlignment = Alignment.CenterVertically ) { Box( modifier = Modifier .size(40.dp) .clip(CircleShape) .background(AppColors.primary.copy(alpha = 0.1f)), contentAlignment = Alignment.Center ) { Icon( imageVector = icon, contentDescription = null, tint = AppColors.primary, modifier = Modifier.size(20.dp) ) } Spacer(modifier = Modifier.width(AppSpacing.sm)) Column(modifier = Modifier.weight(1f)) { Text( text = title, style = AppTypography.body, color = AppColors.primaryText ) Text( text = subtitle, style = AppTypography.caption, color = AppColors.secondaryText ) } Switch( checked = isEnabled, onCheckedChange = onToggle, colors = SwitchDefaults.colors( checkedThumbColor = Color.White, checkedTrackColor = AppColors.primary, uncheckedThumbColor = Color.White, uncheckedTrackColor = AppColors.disabledText ) ) } }