Correction TP 3

This commit is contained in:
Chocolaterie
2025-01-22 16:43:30 +01:00
parent 842202974f
commit e1f584e0b2
4 changed files with 71 additions and 18 deletions

View File

@@ -17,9 +17,15 @@
tools:targetApi="31" > tools:targetApi="31" >
<activity <activity
android:name=".article.ListArticleActivity" android:name=".article.ListArticleActivity"
android:exported="false" android:exported="true"
android:label="@string/title_activity_list_article" android:label="@string/title_activity_list_article"
android:theme="@style/Theme.TpFilRouge" /> android:theme="@style/Theme.TpFilRouge">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity <activity
android:name=".auth.ResetPasswordActivity" android:name=".auth.ResetPasswordActivity"
android:exported="false" android:exported="false"
@@ -35,11 +41,6 @@
android:exported="true" android:exported="true"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/Theme.TpFilRouge" > android:theme="@style/Theme.TpFilRouge" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> </activity>
</application> </application>

View File

@@ -15,7 +15,13 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.material3.CardDefaults import androidx.compose.material3.CardDefaults
import androidx.compose.material3.ElevatedCard import androidx.compose.material3.ElevatedCard
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable 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.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@@ -29,25 +35,48 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage import coil.compose.AsyncImage
import com.example.tpfilrouge.R 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.EniPage
import com.example.tpfilrouge.ui.theme.EniTextField
class ListArticleActivity : ComponentActivity() { class ListArticleActivity : ComponentActivity() {
// Instancier le view model
var viewModel = ListArticleViewModel();
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
ListArticleActivityPage() ListArticleActivityPage(viewModel)
} }
} }
} }
@Composable @Composable
fun ListArticleActivityPage() { fun ArticleForm(viewModel: ListArticleViewModel){
var articles = listOf( var titleFieldState by remember { mutableStateOf("Un article") }
Article("Teletubies", "Meilleur série du monde", "https://avatar.iran.liara.run/public"), var descFieldState by remember { mutableStateOf("Une description") }
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") 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 { EniPage {
Column( Column(
@@ -58,8 +87,9 @@ fun ListArticleActivityPage() {
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = TextStyle(color = Color.White, fontSize = 28.sp)) style = TextStyle(color = Color.White, fontSize = 28.sp))
ArticleForm(viewModel)
LazyColumn { LazyColumn {
items(articles) { article -> items(articlesState) { article ->
ElevatedCard( ElevatedCard(
elevation = CardDefaults.cardElevation(defaultElevation = 6.dp), elevation = CardDefaults.cardElevation(defaultElevation = 6.dp),
modifier = Modifier.fillMaxWidth().padding(vertical = 14.dp) modifier = Modifier.fillMaxWidth().padding(vertical = 14.dp)
@@ -89,5 +119,5 @@ fun ListArticleActivityPage() {
) )
@Composable @Composable
fun ListArticleActivityPreview() { fun ListArticleActivityPreview() {
ListArticleActivityPage() ListArticleActivityPage(ListArticleViewModel())
} }

View File

@@ -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;
}
}

View File

@@ -73,11 +73,15 @@ fun EniButton(label: String, onClick: () -> Unit){
} }
@Composable @Composable
fun EniTextField(label : String){ fun EniTextField(label : String, value: String = "", onValueChange: (String) -> Unit = {}){
TextField(value = "", onValueChange = {}, modifier = Modifier.fillMaxWidth().padding(vertical = 5.dp), TextField(value = value, onValueChange = onValueChange,
modifier = Modifier.fillMaxWidth().padding(vertical = 5.dp),
placeholder = { HintText(label) }, placeholder = { HintText(label) },
colors = TextFieldDefaults.colors( colors = TextFieldDefaults.colors(
unfocusedTextColor = Color(0xDDFFFFFF),
focusedTextColor = Color.White,
unfocusedContainerColor = Color(0x44000000), unfocusedContainerColor = Color(0x44000000),
focusedContainerColor = Color(0x99000000),
unfocusedIndicatorColor = Color.Transparent, unfocusedIndicatorColor = Color.Transparent,
focusedIndicatorColor = Color.Transparent focusedIndicatorColor = Color.Transparent
), ),