From 25d6ef6cdb1f876b70aab1146da33eaab506ec34 Mon Sep 17 00:00:00 2001 From: Pedro Javier Date: Mon, 13 Jul 2026 13:41:20 +0200 Subject: [PATCH] Cambiar la pantalla de login de despues de iniciar sesion --- README.md | 1 + app/build.gradle.kts | 1 + .../java/com/example/saludapp/MainActivity.kt | 25 ++-- .../example/saludapp/data/DatabaseHelper.kt | 8 +- .../com/example/saludapp/ui/HomeScreen.kt | 121 ++++++++++++++++++ .../com/example/saludapp/ui/LoginScreen.kt | 8 +- gradle/libs.versions.toml | 1 + 7 files changed, 144 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/com/example/saludapp/ui/HomeScreen.kt diff --git a/README.md b/README.md index a68add4..d4599cb 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ Saludapp es una aplicación Android moderna enfocada en la salud y el bienestar, - `StartScreen.kt`: Pantalla de bienvenida. - `LoginScreen.kt`: Inicio de sesión con validación de credenciales encriptadas. - `RegisterScreen.kt`: Registro de nuevos usuarios con soporte para nombre completo. + - `HomeScreen.kt`: Dashboard principal con resumen de salud (pasos, sueño, agua, etc.). - `theme/`: Configuración estética de Material 3. --- diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1f0622d..addb003 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -42,6 +42,7 @@ dependencies { implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.activity.compose) implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.material.icons.extended) implementation(libs.androidx.compose.ui) implementation(libs.androidx.compose.ui.graphics) implementation(libs.androidx.compose.ui.tooling.preview) diff --git a/app/src/main/java/com/example/saludapp/MainActivity.kt b/app/src/main/java/com/example/saludapp/MainActivity.kt index d94810d..dfa8fab 100644 --- a/app/src/main/java/com/example/saludapp/MainActivity.kt +++ b/app/src/main/java/com/example/saludapp/MainActivity.kt @@ -4,15 +4,11 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.Text import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier +import com.example.saludapp.ui.HomeScreen import com.example.saludapp.ui.LoginScreen import com.example.saludapp.ui.RegisterScreen import com.example.saludapp.ui.StartScreen @@ -25,27 +21,30 @@ class MainActivity : ComponentActivity() { setContent { SaludappTheme { var currentScreen by remember { mutableStateOf("start") } + var loggedInUserName by remember { mutableStateOf("") } when (currentScreen) { "start" -> StartScreen { currentScreen = "login" } "login" -> LoginScreen( - onLoginSuccess = { currentScreen = "home" }, + onLoginSuccess = { name -> + loggedInUserName = name + currentScreen = "home" + }, onNavigateToRegister = { currentScreen = "register" } ) "register" -> RegisterScreen( onRegisterSuccess = { currentScreen = "login" }, onBackToLogin = { currentScreen = "login" } ) - "home" -> { - Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center - ) { - Text("Bienvenido a Saludapp") + "home" -> HomeScreen( + userName = loggedInUserName, + onLogout = { + loggedInUserName = "" + currentScreen = "start" } - } + ) } } } diff --git a/app/src/main/java/com/example/saludapp/data/DatabaseHelper.kt b/app/src/main/java/com/example/saludapp/data/DatabaseHelper.kt index e85bf78..4558ab9 100644 --- a/app/src/main/java/com/example/saludapp/data/DatabaseHelper.kt +++ b/app/src/main/java/com/example/saludapp/data/DatabaseHelper.kt @@ -19,14 +19,14 @@ object DatabaseHelper { return digest.fold("") { str, it -> str + "%02x".format(it) } } - suspend fun validateLogin(user: String, pass: String): Boolean = withContext(Dispatchers.IO) { + suspend fun validateLogin(user: String, pass: String): String? = withContext(Dispatchers.IO) { var connection: Connection? = null try { Class.forName("org.mariadb.jdbc.Driver") connection = DriverManager.getConnection(URL, USER, PASSWORD) val hashedPass = hashPassword(pass) - val query = "SELECT COUNT(*) FROM usuarios WHERE (username = ? OR email = ?) AND password = ?" + val query = "SELECT nombre_completo FROM usuarios WHERE (username = ? OR email = ?) AND password = ?" connection.prepareStatement(query).use { statement -> statement.setString(1, user) statement.setString(2, user) @@ -34,7 +34,7 @@ object DatabaseHelper { val resultSet = statement.executeQuery() if (resultSet.next()) { - return@withContext resultSet.getInt(1) > 0 + return@withContext resultSet.getString("nombre_completo") ?: user } } } catch (e: Exception) { @@ -46,7 +46,7 @@ object DatabaseHelper { e.printStackTrace() } } - return@withContext false + return@withContext null } suspend fun registerUser(user: String, email: String, pass: String, fullName: String): Boolean = withContext(Dispatchers.IO) { diff --git a/app/src/main/java/com/example/saludapp/ui/HomeScreen.kt b/app/src/main/java/com/example/saludapp/ui/HomeScreen.kt new file mode 100644 index 0000000..33fa6c9 --- /dev/null +++ b/app/src/main/java/com/example/saludapp/ui/HomeScreen.kt @@ -0,0 +1,121 @@ +package com.example.saludapp.ui + +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.DirectionsRun +import androidx.compose.material.icons.automirrored.filled.ExitToApp +import androidx.compose.material.icons.filled.* +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun HomeScreen(userName: String, onLogout: () -> Unit) { + Scaffold( + topBar = { + TopAppBar( + title = { Text("Saludapp", fontWeight = FontWeight.Bold) }, + actions = { + IconButton(onClick = onLogout) { + Icon(Icons.AutoMirrored.Filled.ExitToApp, contentDescription = "Cerrar sesión") + } + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.primaryContainer, + titleContentColor = MaterialTheme.colorScheme.onPrimaryContainer + ) + ) + } + ) { padding -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(padding) + .padding(16.dp) + ) { + Text( + text = "Hola, $userName 👋", + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.Bold + ) + Text( + text = "Aquí tienes tu resumen de hoy", + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + + Spacer(modifier = Modifier.height(24.dp)) + + LazyVerticalGrid( + columns = GridCells.Fixed(2), + horizontalArrangement = Arrangement.spacedBy(16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier.fillMaxSize() + ) { + item { + StatCard("Pasos", "8,432", Icons.AutoMirrored.Filled.DirectionsRun, MaterialTheme.colorScheme.primary) + } + item { + StatCard("Sueño", "7h 20m", Icons.Default.Bedtime, MaterialTheme.colorScheme.secondary) + } + item { + StatCard("Agua", "1.5L", Icons.Default.LocalDrink, MaterialTheme.colorScheme.tertiary) + } + item { + StatCard("Calorías", "1,200 kcal", Icons.Default.Whatshot, MaterialTheme.colorScheme.error) + } + item { + StatCard("Corazón", "72 bpm", Icons.Default.Favorite, MaterialTheme.colorScheme.primary) + } + item { + StatCard("Peso", "70 kg", Icons.Default.MonitorWeight, MaterialTheme.colorScheme.secondary) + } + } + } + } +} + +@Composable +fun StatCard(title: String, value: String, icon: ImageVector, color: androidx.compose.ui.graphics.Color) { + Card( + modifier = Modifier + .fillMaxWidth() + .height(140.dp), + colors = CardDefaults.cardColors(containerColor = color.copy(alpha = 0.1f)) + ) { + Column( + modifier = Modifier + .padding(16.dp) + .fillMaxSize(), + verticalArrangement = Arrangement.SpaceBetween + ) { + Icon( + imageVector = icon, + contentDescription = null, + tint = color, + modifier = Modifier.size(32.dp) + ) + Column { + Text( + text = value, + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Bold, + color = color + ) + Text( + text = title, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + } +} diff --git a/app/src/main/java/com/example/saludapp/ui/LoginScreen.kt b/app/src/main/java/com/example/saludapp/ui/LoginScreen.kt index 1aed607..369cf24 100644 --- a/app/src/main/java/com/example/saludapp/ui/LoginScreen.kt +++ b/app/src/main/java/com/example/saludapp/ui/LoginScreen.kt @@ -11,7 +11,7 @@ import com.example.saludapp.data.DatabaseHelper import kotlinx.coroutines.launch @Composable -fun LoginScreen(onLoginSuccess: () -> Unit, onNavigateToRegister: () -> Unit) { +fun LoginScreen(onLoginSuccess: (String) -> Unit, onNavigateToRegister: () -> Unit) { var email by remember { mutableStateOf("") } var password by remember { mutableStateOf("") } var isLoading by remember { mutableStateOf(false) } @@ -73,10 +73,10 @@ fun LoginScreen(onLoginSuccess: () -> Unit, onNavigateToRegister: () -> Unit) { scope.launch { isLoading = true errorMessage = null - val success = DatabaseHelper.validateLogin(email, password) + val userName = DatabaseHelper.validateLogin(email, password) isLoading = false - if (success) { - onLoginSuccess() + if (userName != null) { + onLoginSuccess(userName) } else { errorMessage = "Usuario o contraseña incorrectos" } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6f05c4a..c79599b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,6 +26,7 @@ androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "u androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-compose-material-icons-extended = { group = "androidx.compose.material", name = "material-icons-extended" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }