From e1f584e0b2d588fe7bff783ef8d09b038e897d8e Mon Sep 17 00:00:00 2001 From: Chocolaterie <110991127+Chocolaterie@users.noreply.github.com> Date: Wed, 22 Jan 2025 16:43:30 +0100 Subject: [PATCH] Correction TP 3 --- app/src/main/AndroidManifest.xml | 15 +++--- .../tpfilrouge/article/ListArticleActivity.kt | 48 +++++++++++++++---- .../article/ListArticleViewModel.kt | 18 +++++++ .../example/tpfilrouge/ui/theme/AppTheme.kt | 8 +++- 4 files changed, 71 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/com/example/tpfilrouge/article/ListArticleViewModel.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7191be4..6b29e58 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,9 +17,15 @@ tools:targetApi="31" > + android:theme="@style/Theme.TpFilRouge"> + + + + + + - - - - - diff --git a/app/src/main/java/com/example/tpfilrouge/article/ListArticleActivity.kt b/app/src/main/java/com/example/tpfilrouge/article/ListArticleActivity.kt index 587940c..d224f73 100644 --- a/app/src/main/java/com/example/tpfilrouge/article/ListArticleActivity.kt +++ b/app/src/main/java/com/example/tpfilrouge/article/ListArticleActivity.kt @@ -15,7 +15,13 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material3.CardDefaults import androidx.compose.material3.ElevatedCard import androidx.compose.material3.Text +import androidx.compose.material3.TextField import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +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 androidx.compose.ui.graphics.Color @@ -29,25 +35,48 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil.compose.AsyncImage import com.example.tpfilrouge.R +import com.example.tpfilrouge.ui.theme.EniButton import com.example.tpfilrouge.ui.theme.EniPage +import com.example.tpfilrouge.ui.theme.EniTextField class ListArticleActivity : ComponentActivity() { + + // Instancier le view model + var viewModel = ListArticleViewModel(); + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { - ListArticleActivityPage() + ListArticleActivityPage(viewModel) } } } @Composable -fun ListArticleActivityPage() { - var articles = listOf( - Article("Teletubies", "Meilleur série du monde", "https://avatar.iran.liara.run/public"), - Article("Velocipastor", "Meilleur film du monde, gros budget", "https://avatar.iran.liara.run/public"), - Article("Photo mouton béret paille ?", "Pourquoi", "https://avatar.iran.liara.run/public") - ); +fun ArticleForm(viewModel: ListArticleViewModel){ + var titleFieldState by remember { mutableStateOf("Un article") } + var descFieldState by remember { mutableStateOf("Une description") } + + Column { + EniTextField(label = "Saisir un Email", value = titleFieldState, + onValueChange = { newValue -> titleFieldState = newValue }) + EniTextField(label = "Saisir une Description", value = descFieldState, + onValueChange = { newValue -> descFieldState = newValue }) + EniButton("Ajouter") { + // Instancer un article avec les infos de la saisie + val newArticle = Article(titleFieldState, descFieldState, + "https://avatar.iran.liara.run/public"); + // Envoyer l'article via une méthode view model + viewModel.addArticle(newArticle) + } + } +} + +@Composable +fun ListArticleActivityPage(viewModel: ListArticleViewModel) { + // Ecouter les changements de la liste d'article dans le ViewModel + val articlesState by viewModel.articles.collectAsState(); EniPage { Column( @@ -58,8 +87,9 @@ fun ListArticleActivityPage() { modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = TextStyle(color = Color.White, fontSize = 28.sp)) + ArticleForm(viewModel) LazyColumn { - items(articles) { article -> + items(articlesState) { article -> ElevatedCard( elevation = CardDefaults.cardElevation(defaultElevation = 6.dp), modifier = Modifier.fillMaxWidth().padding(vertical = 14.dp) @@ -89,5 +119,5 @@ fun ListArticleActivityPage() { ) @Composable fun ListArticleActivityPreview() { - ListArticleActivityPage() + ListArticleActivityPage(ListArticleViewModel()) } \ No newline at end of file diff --git a/app/src/main/java/com/example/tpfilrouge/article/ListArticleViewModel.kt b/app/src/main/java/com/example/tpfilrouge/article/ListArticleViewModel.kt new file mode 100644 index 0000000..b17ff92 --- /dev/null +++ b/app/src/main/java/com/example/tpfilrouge/article/ListArticleViewModel.kt @@ -0,0 +1,18 @@ +package com.example.tpfilrouge.article + +import androidx.lifecycle.ViewModel +import kotlinx.coroutines.flow.MutableStateFlow + +class ListArticleViewModel : ViewModel() { + + var articles = MutableStateFlow(listOf( + Article("Teletubies", "Meilleur série du monde", "https://avatar.iran.liara.run/public"), + Article("Velocipastor", "Meilleur film du monde, gros budget", "https://avatar.iran.liara.run/public"), + Article("Photo mouton béret paille ?", "Pourquoi", "https://avatar.iran.liara.run/public") + )); + + fun addArticle(article: Article){ + articles.value = articles.value + article; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tpfilrouge/ui/theme/AppTheme.kt b/app/src/main/java/com/example/tpfilrouge/ui/theme/AppTheme.kt index fa17c84..07935fa 100644 --- a/app/src/main/java/com/example/tpfilrouge/ui/theme/AppTheme.kt +++ b/app/src/main/java/com/example/tpfilrouge/ui/theme/AppTheme.kt @@ -73,11 +73,15 @@ fun EniButton(label: String, onClick: () -> Unit){ } @Composable -fun EniTextField(label : String){ - TextField(value = "", onValueChange = {}, modifier = Modifier.fillMaxWidth().padding(vertical = 5.dp), +fun EniTextField(label : String, value: String = "", onValueChange: (String) -> Unit = {}){ + TextField(value = value, onValueChange = onValueChange, + modifier = Modifier.fillMaxWidth().padding(vertical = 5.dp), placeholder = { HintText(label) }, colors = TextFieldDefaults.colors( + unfocusedTextColor = Color(0xDDFFFFFF), + focusedTextColor = Color.White, unfocusedContainerColor = Color(0x44000000), + focusedContainerColor = Color(0x99000000), unfocusedIndicatorColor = Color.Transparent, focusedIndicatorColor = Color.Transparent ),