You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
300 lines
11 KiB
300 lines
11 KiB
package com.example.dattingapp.Login
|
|
|
|
import android.os.Bundle
|
|
import androidx.activity.ComponentActivity
|
|
import androidx.activity.compose.setContent
|
|
import androidx.activity.enableEdgeToEdge
|
|
import androidx.compose.foundation.layout.fillMaxSize
|
|
import androidx.compose.foundation.layout.padding
|
|
import androidx.compose.material3.Scaffold
|
|
import androidx.compose.material3.Text
|
|
import com.example.dattingapp.ui.theme.DattingAPPTheme
|
|
import androidx.compose.foundation.Canvas
|
|
import androidx.compose.foundation.background
|
|
import androidx.compose.foundation.border
|
|
import androidx.compose.foundation.clickable
|
|
import androidx.compose.foundation.layout.*
|
|
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.AddAPhoto
|
|
import androidx.compose.material.icons.filled.CameraAlt
|
|
import androidx.compose.material.icons.filled.Image
|
|
import androidx.compose.material3.*
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.draw.shadow
|
|
import androidx.compose.ui.graphics.Brush
|
|
import androidx.compose.ui.graphics.Color
|
|
import androidx.compose.ui.graphics.PathEffect
|
|
import androidx.compose.ui.graphics.drawscope.Stroke
|
|
import androidx.compose.ui.text.font.FontWeight
|
|
import androidx.compose.ui.text.style.TextAlign
|
|
import androidx.compose.ui.tooling.preview.Preview
|
|
import androidx.compose.ui.unit.dp
|
|
import androidx.compose.ui.unit.sp
|
|
class UploadProfileImgae : ComponentActivity() {
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
enableEdgeToEdge()
|
|
setContent {
|
|
DattingAPPTheme {
|
|
ProfileImageUploadScreen()
|
|
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
@Composable
|
|
fun ProfileImageUploadScreen(
|
|
onBackClick: () -> Unit = {},
|
|
onUploadFromGalleryClick: () -> Unit = {},
|
|
onTakePhotoClick: () -> Unit = {},
|
|
onContinueClick: () -> Unit = {},
|
|
onContactSupportClick: () -> Unit = {}
|
|
) {
|
|
val backgroundGradient = Brush.verticalGradient(
|
|
colors = listOf(
|
|
Color(0xFFFFF7F8),
|
|
Color(0xFFFFFFFF),
|
|
Color(0xFFF7EFFC)
|
|
)
|
|
)
|
|
|
|
val buttonGradient = Brush.horizontalGradient(
|
|
colors = listOf(
|
|
Color(0xFFD84B75),
|
|
Color(0xFF8E54C1)
|
|
)
|
|
)
|
|
|
|
val avatarGradientBorder = Brush.sweepGradient(
|
|
colors = listOf(
|
|
Color(0xFFB00020),
|
|
Color(0xFF7B1FA2),
|
|
Color(0xFFB00020)
|
|
)
|
|
)
|
|
|
|
Scaffold(
|
|
topBar = {
|
|
TopAppBar(
|
|
title = {
|
|
Box(
|
|
modifier = Modifier.fillMaxWidth(),
|
|
contentAlignment = Alignment.Center
|
|
) {
|
|
Text(
|
|
text = "VibeCheck",
|
|
fontWeight = FontWeight.Bold,
|
|
color = Color(0xFF9C0037),
|
|
fontSize = 20.sp,
|
|
modifier = Modifier.padding(end = 48.dp) // Offset navigation icon width to center text perfectly
|
|
)
|
|
}
|
|
},
|
|
navigationIcon = {
|
|
IconButton(onClick = onBackClick) {
|
|
Icon(
|
|
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
|
|
contentDescription = "Back",
|
|
tint = Color.Black
|
|
)
|
|
}
|
|
},
|
|
colors = TopAppBarDefaults.topAppBarColors(containerColor = Color.Transparent)
|
|
)
|
|
},
|
|
containerColor = Color.Transparent
|
|
) { innerPadding ->
|
|
Column(
|
|
modifier = Modifier
|
|
.fillMaxSize()
|
|
.background(brush = backgroundGradient)
|
|
.padding(innerPadding)
|
|
.padding(horizontal = 24.dp),
|
|
horizontalAlignment = Alignment.CenterHorizontally
|
|
) {
|
|
Spacer(modifier = Modifier.height(16.dp))
|
|
|
|
Text(
|
|
text = "Upload profile photo",
|
|
fontSize = 22.sp,
|
|
fontWeight = FontWeight.Bold,
|
|
color = Color(0xFF1D1B20)
|
|
)
|
|
|
|
Spacer(modifier = Modifier.height(8.dp))
|
|
|
|
Text(
|
|
text = "Choose a photo that shows your\nbest self. You can always change\nthis later.",
|
|
fontSize = 13.sp,
|
|
color = Color(0xFF666666),
|
|
textAlign = TextAlign.Center,
|
|
lineHeight = 18.sp
|
|
)
|
|
|
|
Spacer(modifier = Modifier.height(36.dp))
|
|
|
|
// Circular Avatar Placeholder with Gradient Ring
|
|
Box(
|
|
contentAlignment = Alignment.Center,
|
|
modifier = Modifier
|
|
.size(190.dp)
|
|
.shadow(
|
|
elevation = 16.dp,
|
|
shape = CircleShape,
|
|
spotColor = Color(0x33B00020),
|
|
ambientColor = Color(0x337B1FA2)
|
|
)
|
|
.background(Color.White, CircleShape)
|
|
.border(width = 3.dp, brush = avatarGradientBorder, shape = CircleShape)
|
|
) {
|
|
// Dashed Inner Circle Outline
|
|
Canvas(modifier = Modifier.size(160.dp)) {
|
|
val stroke = Stroke(
|
|
width = 2f,
|
|
pathEffect = PathEffect.dashPathEffect(floatArrayOf(10f, 10f), 0f)
|
|
)
|
|
drawCircle(
|
|
color = Color(0xFFE0C4CD),
|
|
style = stroke
|
|
)
|
|
}
|
|
|
|
// Center Camera Icon
|
|
Icon(
|
|
imageVector = Icons.Default.AddAPhoto,
|
|
contentDescription = "Add Photo",
|
|
tint = Color(0xFFE5A8B8),
|
|
modifier = Modifier.size(44.dp)
|
|
)
|
|
}
|
|
|
|
Spacer(modifier = Modifier.weight(1f))
|
|
|
|
// Secondary Action Options
|
|
Column(
|
|
verticalArrangement = Arrangement.spacedBy(12.dp),
|
|
modifier = Modifier.fillMaxWidth()
|
|
) {
|
|
// Upload from gallery Button
|
|
Surface(
|
|
onClick = onUploadFromGalleryClick,
|
|
shape = RoundedCornerShape(12.dp),
|
|
color = Color(0xFFE8DDED).copy(alpha = 0.6f),
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.height(48.dp)
|
|
) {
|
|
Row(
|
|
verticalAlignment = Alignment.CenterVertically,
|
|
horizontalArrangement = Arrangement.Center
|
|
) {
|
|
Icon(
|
|
imageVector = Icons.Default.Image,
|
|
contentDescription = null,
|
|
tint = Color(0xFF6B008A),
|
|
modifier = Modifier.size(18.dp)
|
|
)
|
|
Spacer(modifier = Modifier.width(8.dp))
|
|
Text(
|
|
text = "Upload from gallery",
|
|
color = Color(0xFF6B008A),
|
|
fontSize = 13.sp,
|
|
fontWeight = FontWeight.SemiBold
|
|
)
|
|
}
|
|
}
|
|
|
|
// Take a photo Button
|
|
Surface(
|
|
onClick = onTakePhotoClick,
|
|
shape = RoundedCornerShape(12.dp),
|
|
color = Color(0xFFE8DDED).copy(alpha = 0.6f),
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.height(48.dp)
|
|
) {
|
|
Row(
|
|
verticalAlignment = Alignment.CenterVertically,
|
|
horizontalArrangement = Arrangement.Center
|
|
) {
|
|
Icon(
|
|
imageVector = Icons.Default.CameraAlt,
|
|
contentDescription = null,
|
|
tint = Color(0xFF6B008A),
|
|
modifier = Modifier.size(18.dp)
|
|
)
|
|
Spacer(modifier = Modifier.width(8.dp))
|
|
Text(
|
|
text = "Take a photo",
|
|
color = Color(0xFF6B008A),
|
|
fontSize = 13.sp,
|
|
fontWeight = FontWeight.SemiBold
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
Spacer(modifier = Modifier.height(20.dp))
|
|
|
|
// Main Gradient Continue Button
|
|
Button(
|
|
onClick = onContinueClick,
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.height(50.dp)
|
|
.background(
|
|
brush = buttonGradient,
|
|
shape = RoundedCornerShape(12.dp)
|
|
),
|
|
colors = ButtonDefaults.buttonColors(containerColor = Color.Transparent),
|
|
shape = RoundedCornerShape(12.dp)
|
|
) {
|
|
Text(
|
|
text = "Continue",
|
|
color = Color.White,
|
|
fontWeight = FontWeight.Bold,
|
|
fontSize = 16.sp
|
|
)
|
|
}
|
|
|
|
Spacer(modifier = Modifier.height(16.dp))
|
|
|
|
// Need help? Contact support Footer
|
|
Row(
|
|
horizontalArrangement = Arrangement.Center,
|
|
verticalAlignment = Alignment.CenterVertically
|
|
) {
|
|
Text(
|
|
text = "Need help? ",
|
|
fontSize = 12.sp,
|
|
color = Color(0xFF666666)
|
|
)
|
|
Text(
|
|
text = "Contact support",
|
|
fontSize = 12.sp,
|
|
fontWeight = FontWeight.Bold,
|
|
color = Color(0xFFB00020),
|
|
modifier = Modifier.clickable { onContactSupportClick() }
|
|
)
|
|
}
|
|
|
|
Spacer(modifier = Modifier.height(16.dp))
|
|
}
|
|
}
|
|
}
|
|
|
|
@Preview(showBackground = true, device = "spec:width=411dp,height=891dp")
|
|
@Composable
|
|
fun ProfileImageUploadScreenPreview() {
|
|
ProfileImageUploadScreen()
|
|
}
|
|
|