From 586f854b9d3d443ebd5079e90b7314ae2dba99e8 Mon Sep 17 00:00:00 2001 From: Chocolaterie <110991127+Chocolaterie@users.noreply.github.com> Date: Wed, 29 Jan 2025 13:59:31 +0100 Subject: [PATCH] Correction TP 7 --- app/src/main/AndroidManifest.xml | 25 ++---- .../tpfilrouge/article/ArticleActivity.kt | 46 +++++++++++ .../tpfilrouge/article/ArticleFormFragment.kt | 80 +++++++++++++++++++ ...icleActivity.kt => ListArticleFragment.kt} | 53 ++---------- .../example/tpfilrouge/auth/LoginFragment.kt | 4 +- 5 files changed, 141 insertions(+), 67 deletions(-) create mode 100644 app/src/main/java/com/example/tpfilrouge/article/ArticleActivity.kt create mode 100644 app/src/main/java/com/example/tpfilrouge/article/ArticleFormFragment.kt rename app/src/main/java/com/example/tpfilrouge/article/{ListArticleActivity.kt => ListArticleFragment.kt} (66%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 23736f1..58924b9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,33 +17,22 @@ android:theme="@style/Theme.TpFilRouge" tools:targetApi="31" > - - - - - + + \ No newline at end of file diff --git a/app/src/main/java/com/example/tpfilrouge/article/ArticleActivity.kt b/app/src/main/java/com/example/tpfilrouge/article/ArticleActivity.kt new file mode 100644 index 0000000..b998f05 --- /dev/null +++ b/app/src/main/java/com/example/tpfilrouge/article/ArticleActivity.kt @@ -0,0 +1,46 @@ +package com.example.tpfilrouge.article + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController + +class ArticleActivity : ComponentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContent { + ArticleActivityPage() + } + } +} + +@Composable +fun ArticleActivityPage() { + val navController = rememberNavController(); + + var viewModel = ListArticleViewModel(); + + NavHost( + navController = navController, + startDestination = "list_article" + ) { + composable("list_article") { ListArticleFragmentPage(viewModel, navController) } + composable("article_form") { ArticleFormFragmentPage(viewModel) } + } +} + +@Preview( + showBackground = true, + locale = "en" +) +@Composable +fun ActivityActivityPreview() { + ArticleActivityPage() +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tpfilrouge/article/ArticleFormFragment.kt b/app/src/main/java/com/example/tpfilrouge/article/ArticleFormFragment.kt new file mode 100644 index 0000000..1f764f5 --- /dev/null +++ b/app/src/main/java/com/example/tpfilrouge/article/ArticleFormFragment.kt @@ -0,0 +1,80 @@ +package com.example.tpfilrouge.article + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Text +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 +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +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 +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 +import kotlinx.coroutines.flow.MutableStateFlow + +@Composable +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 ArticleFormFragmentPage(viewModel: ListArticleViewModel) { + + EniPage { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(40.dp) + ) { + Text(text = "Ajouter un article", + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center, + style = TextStyle(color = Color.White, fontSize = 28.sp) + ) + ArticleForm(viewModel) + } + } +} + +@Preview( + showBackground = true, +) +@Composable +fun ArticleFormFragmentPreview() { + var viewModel = ListArticleViewModel(); + viewModel.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") + )); + ArticleFormFragmentPage(viewModel) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tpfilrouge/article/ListArticleActivity.kt b/app/src/main/java/com/example/tpfilrouge/article/ListArticleFragment.kt similarity index 66% rename from app/src/main/java/com/example/tpfilrouge/article/ListArticleActivity.kt rename to app/src/main/java/com/example/tpfilrouge/article/ListArticleFragment.kt index f2d4f1e..adefcf3 100644 --- a/app/src/main/java/com/example/tpfilrouge/article/ListArticleActivity.kt +++ b/app/src/main/java/com/example/tpfilrouge/article/ListArticleFragment.kt @@ -1,10 +1,5 @@ package com.example.tpfilrouge.article -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth @@ -15,13 +10,9 @@ 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 @@ -33,47 +24,13 @@ 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 +import androidx.navigation.NavController 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 import kotlinx.coroutines.flow.MutableStateFlow -class ListArticleActivity : ComponentActivity() { - - // Instancier le view model - var viewModel = ListArticleViewModel(); - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - enableEdgeToEdge() - setContent { - ListArticleActivityPage(viewModel) - } - } -} - -@Composable -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 ArticleCard(article: Article){ ElevatedCard( @@ -97,7 +54,7 @@ fun ArticleCard(article: Article){ } @Composable -fun ListArticleActivityPage(viewModel: ListArticleViewModel) { +fun ListArticleFragmentPage(viewModel: ListArticleViewModel, navController: NavController? = null) { // Ecouter les changements de la liste d'article dans le ViewModel val articlesState by viewModel.articles.collectAsState(); @@ -110,7 +67,9 @@ fun ListArticleActivityPage(viewModel: ListArticleViewModel) { modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = TextStyle(color = Color.White, fontSize = 28.sp)) - ArticleForm(viewModel) + EniButton("Ajouter un Article") { + navController!!.navigate("article_form") + } EniButton("Rafraichir") { // Appeler l'api du viewmodel viewModel.callArticlesApi() @@ -135,5 +94,5 @@ fun ListArticleActivityPreview() { 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") )); - ListArticleActivityPage(viewModel) + ListArticleFragmentPage(viewModel) } \ No newline at end of file diff --git a/app/src/main/java/com/example/tpfilrouge/auth/LoginFragment.kt b/app/src/main/java/com/example/tpfilrouge/auth/LoginFragment.kt index 8ab94aa..90e835d 100644 --- a/app/src/main/java/com/example/tpfilrouge/auth/LoginFragment.kt +++ b/app/src/main/java/com/example/tpfilrouge/auth/LoginFragment.kt @@ -21,7 +21,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.navigation.NavController import com.example.tpfilrouge.R -import com.example.tpfilrouge.article.ListArticleActivity +import com.example.tpfilrouge.article.ArticleActivity import com.example.tpfilrouge.ui.theme.EniButton import com.example.tpfilrouge.ui.theme.EniPage import com.example.tpfilrouge.ui.theme.EniTextField @@ -62,7 +62,7 @@ fun LoginFragmentPage(loginViewModel: LoginViewModel, navController: NavControll loginViewModel.callLoginApi( onSuccess = { // je change de page (page article - context.startActivity(Intent(context, ListArticleActivity::class.java)) + context.startActivity(Intent(context, ArticleActivity::class.java)) } ) })