Membuat Aplikasi Login Page Sederhana

Burhanudin Rifa - 5025201191

PPB - D

Github: Link

Youtube: Link








package com.example.loginpage

import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Lock
import androidx.compose.material.icons.filled.Email
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.ExitToApp
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.*
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.loginpage.ui.theme.LoginPageTheme

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
LoginPageTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = Color(0xFFF5F5F5) // Light gray background
) {
var isLoggedIn by remember { mutableStateOf(false) }
var userEmail by remember { mutableStateOf("") }

if (isLoggedIn) {
HomeScreen(
email = userEmail,
onLogout = {
isLoggedIn = false
userEmail = ""
}
)
} else {
LoginScreen(
onLoginSuccess = { email ->
userEmail = email
isLoggedIn = true
}
)
}
}
}
}
}
}

@Composable
fun LoginScreen(onLoginSuccess: (String) -> Unit) {
val context = LocalContext.current
var email by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }
var passwordVisible by remember { mutableStateOf(false) }

Column(
modifier = Modifier
.fillMaxSize()
.padding(32.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
// Welcome header with icon
Icon(
imageVector = Icons.Filled.Person,
contentDescription = null,
modifier = Modifier.size(80.dp),
tint = Color(0xFF6200EA) // Purple accent
)

Spacer(modifier = Modifier.height(16.dp))

Text(
"Welcome Back!",
style = MaterialTheme.typography.headlineMedium.copy(
fontWeight = FontWeight.Bold,
color = Color(0xFF2E2E2E)
)
)

Text(
"Please sign in to continue",
style = MaterialTheme.typography.bodyMedium.copy(
color = Color(0xFF666666)
)
)

Spacer(modifier = Modifier.height(48.dp))

// Email field with leading icon
OutlinedTextField(
value = email,
onValueChange = { email = it },
label = { Text("Email Address") },
leadingIcon = {
Icon(
imageVector = Icons.Filled.Email,
contentDescription = null
)
},
singleLine = true,
modifier = Modifier.fillMaxWidth()
)

Spacer(modifier = Modifier.height(20.dp))

// Password field
OutlinedTextField(
value = password,
onValueChange = { password = it },
label = { Text("Password") },
leadingIcon = {
Icon(
imageVector = Icons.Filled.Lock,
contentDescription = null
)
},
singleLine = true,
modifier = Modifier.fillMaxWidth(),
visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(),
trailingIcon = {
TextButton(
onClick = { passwordVisible = !passwordVisible }
) {
Text(
if (passwordVisible) "Hide" else "Show",
fontSize = 12.sp
)
}
}
)

Spacer(modifier = Modifier.height(32.dp))

// Login button with gradient-like effect using MaterialTheme
Button(
onClick = {
if (email.isBlank() || password.isBlank()) {
Toast.makeText(context, "Email dan password tidak boleh kosong!", Toast.LENGTH_SHORT).show()
} else {
onLoginSuccess(email)
}
},
modifier = Modifier
.fillMaxWidth()
.height(56.dp),
shape = RoundedCornerShape(16.dp),
colors = ButtonDefaults.buttonColors(
containerColor = Color(0xFF6200EA),
contentColor = Color.White
)
) {
Text(
"Sign In",
fontSize = 16.sp,
fontWeight = FontWeight.Medium
)
}
}
}

@Composable
fun HomeScreen(email: String, onLogout: () -> Unit) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(32.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
// Success icon
Icon(
imageVector = Icons.Filled.Person,
contentDescription = null,
modifier = Modifier.size(100.dp),
tint = Color(0xFF4CAF50) // Green success color
)

Spacer(modifier = Modifier.height(24.dp))

Text(
"Welcome Back!",
style = MaterialTheme.typography.headlineMedium.copy(
fontWeight = FontWeight.Bold,
color = Color(0xFF2E2E2E)
)
)

Text(
email,
style = MaterialTheme.typography.bodyLarge.copy(
color = Color(0xFF666666)
)
)

Spacer(modifier = Modifier.height(48.dp))

// Logout button with icon
Button(
onClick = onLogout,
modifier = Modifier
.fillMaxWidth()
.height(56.dp),
shape = RoundedCornerShape(16.dp),
colors = ButtonDefaults.buttonColors(
containerColor = Color(0xFFFF5722), // Orange-red
contentColor = Color.White
)
) {
Icon(
imageVector = Icons.Filled.ExitToApp,
contentDescription = null,
modifier = Modifier.size(20.dp)
)
Spacer(modifier = Modifier.width(8.dp))
Text(
"Sign Out",
fontSize = 16.sp,
fontWeight = FontWeight.Medium
)
}
}
}

Comments

Popular posts from this blog

Aplikasi Expense Tracker - Expenz