diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1d17403..d63fe80 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -54,6 +54,8 @@ dependencies { implementation(libs.androidx.compose.ui.tooling.preview) implementation(libs.androidx.compose.material3) implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.material3) + implementation("androidx.compose.material:material-icons-extended:1.4.3") testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..5da8c70 Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/com/dev/collectiondvd/MainActivity.kt b/app/src/main/java/com/dev/collectiondvd/MainActivity.kt index d1ef7c5..6ea7c0f 100644 --- a/app/src/main/java/com/dev/collectiondvd/MainActivity.kt +++ b/app/src/main/java/com/dev/collectiondvd/MainActivity.kt @@ -49,8 +49,9 @@ import com.dev.collectiondvd.viewmodel.LocalDvdViewModel import com.dev.collectiondvd.viewmodel.factory.LocalDvdViewModelFactory import androidx.compose.material3.* import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.Delete +import androidx.compose.material.icons.filled.Edit +import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.DropdownMenu @@ -172,7 +173,12 @@ fun MenuScreen( Spacer(modifier = Modifier.height(8.dp)) - DvdList(filteredAndSortedDvds) + DvdList( + dvds = filteredAndSortedDvds, + onDelete = { dvd -> + viewModel.deleteDvd(dvd) + } + ) } } } @@ -258,65 +264,111 @@ fun SortChip( @Composable fun DvdList( - dvds: List + dvds: List, + onDelete: (Dvd) -> Unit ) { LazyColumn { items(dvds, key = { it.id }) { dvd -> - Card( + DvdItem(dvd = dvd, onDelete = onDelete) + } + } +} + +@Composable +fun DvdItem( + dvd: Dvd, + onDelete: (Dvd) -> Unit +) { + var expanded by remember { mutableStateOf(false) } + + Card( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 6.dp), + shape = RoundedCornerShape(12.dp) + ) { + Column { + + // Ligne du haut : titre + menu + Row( modifier = Modifier .fillMaxWidth() - .padding(vertical = 6.dp), - shape = RoundedCornerShape(16.dp) + .padding(8.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.Top ) { - Row( - modifier = Modifier.padding(12.dp), - verticalAlignment = Alignment.CenterVertically - ) { - - // 📀 Affiche (image fictive si pas encore stockée) - Box( - modifier = Modifier - .height(90.dp) - .width(60.dp) - .background( - MaterialTheme.colorScheme.surfaceVariant, - RoundedCornerShape(8.dp) - ) - ) - - Spacer(modifier = Modifier.width(12.dp)) - - Column { - Text( - dvd.titre.orEmpty().uppercase(), - fontWeight = FontWeight.SemiBold, - fontSize = 16.sp, - color = Color(0xFFFFA405) + Text( + dvd.titre.orEmpty().uppercase(), + fontWeight = FontWeight.SemiBold, + fontSize = 16.sp, + color = Color(0xFFFFA405) + ) + Box { + IconButton(onClick = { expanded = true }) { + Icon( + imageVector = Icons.Default.MoreVert, + contentDescription = "Menu" ) + } - Spacer(modifier = Modifier.height(4.dp)) - - Text( - "Réalisateur: ${dvd.realisateur.orEmpty().uppercase()}", - fontSize = 13.sp, - color = MaterialTheme.colorScheme.onSurfaceVariant + DropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + DropdownMenuItem( + text = { Text("Supprimer") }, + leadingIcon = { + Icon( + imageVector = Icons.Default.Delete, + contentDescription = null + ) + }, + onClick = { + expanded = false + onDelete(dvd) + } ) - - Text( - "Année: ${dvd.annee.orEmpty()}", - fontSize = 13.sp, - color = MaterialTheme.colorScheme.onSurfaceVariant - ) - - Text( - "Genre: ${dvd.genre.orEmpty().uppercase()}", - fontSize = 13.sp, - color = MaterialTheme.colorScheme.onSurfaceVariant + DropdownMenuItem( + text = { Text("Modifier") }, + leadingIcon = { + Icon( + imageVector = Icons.Default.Edit, + contentDescription = null + ) + }, + onClick = {} ) } } } + + Divider() + + // 📀 Contenu + Row( + modifier = Modifier.padding(12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + + Box( + modifier = Modifier + .height(90.dp) + .width(60.dp) + .background( + MaterialTheme.colorScheme.surfaceVariant, + RoundedCornerShape(8.dp) + ) + ) + + Spacer(modifier = Modifier.width(12.dp)) + + Column { + Text("Réalisateur: ${dvd.realisateur.orEmpty().uppercase()}") + Text("Année: ${dvd.annee.orEmpty()}") + Text("Genre: ${dvd.genre.orEmpty().uppercase()}") + } + } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/dev/collectiondvd/ui/img/Collec.png b/app/src/main/java/com/dev/collectiondvd/ui/img/Collec.png new file mode 100644 index 0000000..c46bed9 Binary files /dev/null and b/app/src/main/java/com/dev/collectiondvd/ui/img/Collec.png differ diff --git a/app/src/main/java/com/dev/collectiondvd/ui/screen/AjoutDvdActivity.kt b/app/src/main/java/com/dev/collectiondvd/ui/screen/AjoutDvdActivity.kt index 80cf6ed..baf4024 100644 --- a/app/src/main/java/com/dev/collectiondvd/ui/screen/AjoutDvdActivity.kt +++ b/app/src/main/java/com/dev/collectiondvd/ui/screen/AjoutDvdActivity.kt @@ -12,9 +12,15 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ExtendedFloatingActionButton +import androidx.compose.material3.FabPosition import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -22,11 +28,13 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.dev.collectiondvd.data.local.AppDatabase import com.dev.collectiondvd.data.local.entities.Dvd import com.dev.collectiondvd.data.repository.LocalDvdRepository +import com.dev.collectiondvd.ui.theme.CollectionDvdTheme import com.dev.collectiondvd.ui.theme.MyButton import com.dev.collectiondvd.viewmodel.LocalDvdViewModel import com.dev.collectiondvd.viewmodel.factory.LocalDvdViewModelFactory @@ -45,87 +53,102 @@ class AjoutDvdActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { - AjoutDvdScreen(onQuit = { finish() }, onAdd = - { dvd -> - viewModel.addDvd(dvd) - finish() - } - ) + CollectionDvdTheme(darkTheme = true) { + AjoutDvdScreen( + onQuit = { finish() }, + onAdd = { dvd -> + viewModel.addDvd(dvd) + finish() + } + ) + } } } } + @Composable -fun AjoutDvdScreen(onQuit: () -> Unit, onAdd: (Dvd) -> Unit){ - //val context = LocalContext.current - var titre by remember() { mutableStateOf("") } - var annee by remember() { mutableStateOf("") } - var realisateur by remember() { mutableStateOf("") } - var genre by remember() { mutableStateOf("") } - Column( - modifier = Modifier - .fillMaxSize() - .padding(16.dp), - verticalArrangement = Arrangement.spacedBy(16.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { +fun AjoutDvdScreen( + onQuit: () -> Unit, + onAdd: (Dvd) -> Unit +) { + var titre by remember { mutableStateOf("") } + var annee by remember { mutableStateOf("") } + var realisateur by remember { mutableStateOf("") } + var genre by remember { mutableStateOf("") } - Spacer(modifier = Modifier.height(12.dp)) + Scaffold( + containerColor = MaterialTheme.colorScheme.background, // fond sombre - Text("Ajouter un dvd", - fontSize = 26.sp, - style = MaterialTheme.typography.titleLarge, - modifier = Modifier.padding(bottom = 20.dp) - ) - - OutlinedTextField( - value = titre, - onValueChange = { newValue -> titre = newValue }, - label = {Text("Titre")}, - modifier = Modifier.fillMaxWidth() - ) - OutlinedTextField( - value = realisateur, - onValueChange = { newValue -> realisateur = newValue }, - label = {Text("Réalisateur")}, - modifier = Modifier.fillMaxWidth() - ) - OutlinedTextField( - value = annee, - onValueChange = { newValue -> annee = newValue }, - label = {Text("Année")}, - modifier = Modifier.fillMaxWidth() - ) - OutlinedTextField( - value = genre, - onValueChange = { newValue -> genre = newValue }, - label = {Text("Genre")}, - modifier = Modifier.fillMaxWidth() - ) - - Spacer(modifier = Modifier.height(20.dp)) - - Row( - Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.Center + ) { padding -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(padding) + .padding(horizontal = 16.dp, vertical = 12.dp), + verticalArrangement = Arrangement.spacedBy(16.dp), + horizontalAlignment = Alignment.CenterHorizontally ) { - MyButton("Valider") { - if(titre.isNotBlank()){ - onAdd( - Dvd( - titre = titre, - annee = annee, - realisateur = realisateur, - genre = genre + + Text( + "Ajouter un DVD", + fontSize = 26.sp, + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.onBackground + ) + + // Champs stylisés + StyledTextField(value = titre, onValueChange = { titre = it }, label = "Titre") + StyledTextField(value = realisateur, onValueChange = { realisateur = it }, label = "Réalisateur") + StyledTextField(value = annee, onValueChange = { annee = it }, label = "Année") + StyledTextField(value = genre, onValueChange = { genre = it }, label = "Genre") + + Spacer(modifier = Modifier.height(16.dp)) + + Row{ + MyButton("Valider") { + if (titre.isNotBlank()) { + onAdd( + Dvd( + titre = titre, + annee = annee, + realisateur = realisateur, + genre = genre + ) ) - ) + } } + MyButton("Quitter") { onQuit() } } - - MyButton("Quitter") { onQuit() } - } - } -} \ No newline at end of file +} + +@Composable +fun StyledTextField( + value: String, + onValueChange: (String) -> Unit, + label: String +) { + OutlinedTextField( + value = value, + onValueChange = onValueChange, + placeholder = { Text(label, color = MaterialTheme.colorScheme.onSurfaceVariant) }, + singleLine = true, + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(50), + colors = TextFieldDefaults.colors( + focusedTextColor = MaterialTheme.colorScheme.onSurface, + unfocusedTextColor = MaterialTheme.colorScheme.onSurface, + focusedContainerColor = MaterialTheme.colorScheme.surfaceVariant, + unfocusedContainerColor = MaterialTheme.colorScheme.surfaceVariant, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + focusedPlaceholderColor = MaterialTheme.colorScheme.onSurfaceVariant, + unfocusedPlaceholderColor = MaterialTheme.colorScheme.onSurfaceVariant, + cursorColor = MaterialTheme.colorScheme.primary + ) + ) + +} diff --git a/app/src/main/java/com/dev/collectiondvd/ui/screen/SupprDvdActivity.kt b/app/src/main/java/com/dev/collectiondvd/ui/screen/SupprDvdActivity.kt index 97e4d0e..0d3878b 100644 --- a/app/src/main/java/com/dev/collectiondvd/ui/screen/SupprDvdActivity.kt +++ b/app/src/main/java/com/dev/collectiondvd/ui/screen/SupprDvdActivity.kt @@ -3,8 +3,6 @@ package com.dev.collectiondvd.ui.screen import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import androidx.activity.viewModels -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height @@ -97,7 +95,7 @@ fun SupprDvdScreen(onQuit: () -> Unit, viewModel: LocalDvdViewModel){ MyButton("Supprimer le Dvd") { - viewModel.deleteDvd() + viewModel.deleteDvd(dvd) selectedId = null } } diff --git a/app/src/main/java/com/dev/collectiondvd/ui/theme/Theme.kt b/app/src/main/java/com/dev/collectiondvd/ui/theme/Theme.kt index 9dd8451..e4005c6 100644 --- a/app/src/main/java/com/dev/collectiondvd/ui/theme/Theme.kt +++ b/app/src/main/java/com/dev/collectiondvd/ui/theme/Theme.kt @@ -3,7 +3,9 @@ package com.dev.collectiondvd.ui.theme import android.app.Activity import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.MaterialTheme @@ -65,17 +67,15 @@ fun CollectionDvdTheme( } @Composable -fun MyButton( - text: String, - onClick: () -> Unit -) { +fun MyButton(text: String, onClick: () -> Unit) { Button( onClick = onClick, colors = ButtonDefaults.buttonColors( - containerColor = Color.Blue, // Couleur de fond - contentColor = Color.White // Couleur du texte + containerColor = Color(0xFFFFA405), // ton orange + contentColor = Color.Black ), - modifier = Modifier.size(width = 200.dp, height = 50.dp) // Taille uniforme + shape = RoundedCornerShape(50), + modifier = Modifier.padding(horizontal = 8.dp) ) { Text(text) } diff --git a/app/src/main/java/com/dev/collectiondvd/viewmodel/LocalDvdViewModel.kt b/app/src/main/java/com/dev/collectiondvd/viewmodel/LocalDvdViewModel.kt index 359fb6d..39af12e 100644 --- a/app/src/main/java/com/dev/collectiondvd/viewmodel/LocalDvdViewModel.kt +++ b/app/src/main/java/com/dev/collectiondvd/viewmodel/LocalDvdViewModel.kt @@ -38,12 +38,9 @@ class LocalDvdViewModel ( } } - fun deleteDvd() { + fun deleteDvd(dvd: Dvd) { viewModelScope.launch { - _selectedDvd.value?.let { dvd -> - repository.deleteDvd(dvd) - _selectedDvd.value = null - } + repository.deleteDvd(dvd) } } diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 56% rename from app/src/main/res/mipmap-anydpi/ic_launcher.xml rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 6f3b755..c4a603d 100644 --- a/app/src/main/res/mipmap-anydpi/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,5 @@ - - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 56% rename from app/src/main/res/mipmap-anydpi/ic_launcher_round.xml rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 6f3b755..c4a603d 100644 --- a/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,6 +1,5 @@ - - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp index c209e78..93f61ea 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.webp and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..e05e2dc Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp index b2dfe3d..e290c05 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp index 4f0f1d6..ab25a54 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.webp and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..3f0c039 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp index 62b611d..d48f02f 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp index 948a307..3c4f264 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..8fdbaea Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp index 1b9a695..d3d1f5d 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp index 28d4b77..3277d75 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..ba59729 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp index 9287f50..b0ca9b7 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp index aa7d642..ea35a83 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..3f3e546 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp index 9126ae3..13aa7f8 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0cb414e..01870cc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,6 +9,7 @@ lifecycleRuntimeKtx = "2.10.0" activityCompose = "1.12.1" composeBom = "2024.09.00" uiGraphics = "1.10.0" +material3 = "1.4.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -26,6 +27,7 @@ androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui- androidx-compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics", version.ref = "uiGraphics" } +androidx-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "material3" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }