Page d'affichage d'1 article

navigationHost
Shana CASCARRA 1 year ago
parent c2abb90896
commit 2818828c3c

@ -59,12 +59,15 @@ dependencies {
implementation("androidx.core:core-ktx:1.10.1") implementation("androidx.core:core-ktx:1.10.1")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1")
implementation("androidx.activity:activity-compose:1.7.0") implementation("androidx.activity:activity-compose:1.7.0")
implementation("androidx.navigation:navigation-compose:2.4.0-alpha08")
implementation(platform("androidx.compose:compose-bom:2023.08.00")) implementation(platform("androidx.compose:compose-bom:2023.08.00"))
implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material3:material3") implementation("androidx.compose.material3:material3")
implementation("com.google.firebase:firebase-crashlytics-buildtools:2.9.9") implementation("com.google.firebase:firebase-crashlytics-buildtools:2.9.9")
implementation("androidx.navigation:navigation-compose:2.8.0-alpha05")
testImplementation("junit:junit:4.13.2") testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
@ -75,4 +78,5 @@ dependencies {
implementation("io.coil-kt:coil-compose:1.4.0") implementation("io.coil-kt:coil-compose:1.4.0")
} }

@ -7,6 +7,9 @@ import androidx.compose.ui.graphics.Color
import com.example.veraxapplication.articles.IArticlesDataManager import com.example.veraxapplication.articles.IArticlesDataManager
import com.example.veraxapplication.articles.StubArticles import com.example.veraxapplication.articles.StubArticles
import com.example.veraxapplication.modele.ApiClient import com.example.veraxapplication.modele.ApiClient
import com.example.veraxapplication.modele.articles.Article
import com.example.veraxapplication.navigation.VeraxNavHost
import com.example.veraxapplication.ui.article.AfficherArticle
import com.example.veraxapplication.ui.topBar.TopBarVerax import com.example.veraxapplication.ui.topBar.TopBarVerax
// doc navBar: https://developer.android.com/reference/kotlin/androidx/compose/material3/package-summary#TopAppBar(kotlin.Function0,androidx.compose.ui.Modifier,kotlin.Function0,kotlin.Function1,androidx.compose.foundation.layout.WindowInsets,androidx.compose.material3.TopAppBarColors,androidx.compose.material3.TopAppBarScrollBehavior) // doc navBar: https://developer.android.com/reference/kotlin/androidx/compose/material3/package-summary#TopAppBar(kotlin.Function0,androidx.compose.ui.Modifier,kotlin.Function0,kotlin.Function1,androidx.compose.foundation.layout.WindowInsets,androidx.compose.material3.TopAppBarColors,androidx.compose.material3.TopAppBarScrollBehavior)
@ -28,7 +31,6 @@ class MainActivity : ComponentActivity() {
var theme = listOf("Economique", "Culture", "Politique", "Faits divers") var theme = listOf("Economique", "Culture", "Politique", "Faits divers")
var color = Color(0xFF00FF00)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -36,16 +38,11 @@ class MainActivity : ComponentActivity() {
//TopBarVerax(theme = theme, articles = articlesApi) //TopBarVerax(theme = theme, articles = articlesApi)
TopBarVerax(theme = theme, articles = articles) // TopBarVerax(theme = theme, articles = articles)
VeraxNavHost()
// allez sur la doc de Scaffold sur Android Dev et si vous comprenez comment on doit faire bien ouej
// articles?.forEach({ a -> println(a)})
/*articles?.forEach({ a ->
Log.println(Log.ASSERT, "debug articles", a.toString())
})*/
} }
} }
} }

@ -88,11 +88,11 @@ class StubArticles() : IArticlesDataManager {
article1Contenus.add( article1Contenus.add(
ContenuParagraphe( ContenuParagraphe(
1, "Le mystérieux cygne noir.", 1, "Le mystérieux cygne noir.",
"Sous les traits dun mystérieux cygne noir, un objet vidéo non identifié plane dans la galaxie \n" + "Sous les traits dun mystérieux cygne noir, un objet vidéo non identifié plane dans la galaxie " +
" médiatique. Ambiance Star Wars. Après une musique lancinante, sur fond noir et fumée grisâtre,\n" + " médiatique. Ambiance Star Wars. Après une musique lancinante, sur fond noir et fumée grisâtre," +
" un invité apparaît, et la voix dun intervieweur-mystère situé hors champ linvite à se\n" + " un invité apparaît, et la voix dun intervieweur-mystère situé hors champ linvite à se" +
" présenter « succinctement ». Cest ainsi quon entre dans le monde de ThinkerView, \n" + " présenter « succinctement ». Cest ainsi quon entre dans le monde de ThinkerView," +
" chaîne qui a commencé à diffuser en janvier 2013 sur YouTube. Ici, pas de publicité,\n" + " chaîne qui a commencé à diffuser en janvier 2013 sur YouTube. Ici, pas de publicité," +
" pas de montage, pas deffets de lumière. Le calme, peut-être pour annoncer la tempête." " pas de montage, pas deffets de lumière. Le calme, peut-être pour annoncer la tempête."
) )
) )
@ -106,13 +106,13 @@ class StubArticles() : IArticlesDataManager {
article1Contenus.add( article1Contenus.add(
ContenuParagraphe( ContenuParagraphe(
2, "Penser, réfléchir et s'exprimer librement.", 2, "Penser, réfléchir et s'exprimer librement.",
("Dernier carton en date : un entretien de deux heures avec Juan Branco, lavocat du gilet \n" + ("Dernier carton en date : un entretien de deux heures avec Juan Branco, lavocat du gilet" +
" jaune Maxime Nicolle et « conseiller juridique » de Wikileaks. Quelques jours avant lui,\n" + " jaune Maxime Nicolle et « conseiller juridique » de Wikileaks. Quelques jours avant lui," +
" cétait au tour de François Boulo, autre avocat inscrit au barreau de Rouen et lun des\n" + " cétait au tour de François Boulo, autre avocat inscrit au barreau de Rouen et lun des" +
" porte-parole des « gilets jaunes ». « Ici, les gens ont vraiment le temps de développer \n" + " porte-parole des « gilets jaunes ». « Ici, les gens ont vraiment le temps de développer" +
" leurs idées, confie Boulo. Il faut pouvoir écouter une pensée complète, sans être interrompu.\n" + " leurs idées, confie Boulo. Il faut pouvoir écouter une pensée complète, sans être interrompu." +
" » Aux yeux de ce fils dune famille de droite populaire (paysans et commerçants), ThinkerView \n" + " » Aux yeux de ce fils dune famille de droite populaire (paysans et commerçants), ThinkerView" +
" a réalisé ce dont Pierre Bourdieu avait rêvé. Sil sabreuve à cette source depuis « un an ou \n" + " a réalisé ce dont Pierre Bourdieu avait rêvé. Sil sabreuve à cette source depuis « un an ou" +
" deux », en réalité, ce nest pas lui qui la trouvée, mais linverse. Magie des algorithmes.") " deux », en réalité, ce nest pas lui qui la trouvée, mais linverse. Magie des algorithmes.")
) )
) )
@ -126,18 +126,18 @@ class StubArticles() : IArticlesDataManager {
article1Contenus.add( article1Contenus.add(
ContenuParagraphe( ContenuParagraphe(
3, "Une alternative dans un monde aux informations formatées", 3, "Une alternative dans un monde aux informations formatées",
("\\\"Nous faisons des interviews aux perspectives alternatives dans un monde aux informations formatées\\\",\n" + ("\\\"Nous faisons des interviews aux perspectives alternatives dans un monde aux informations formatées\\\"," +
" explique le site Thinkerview. La marque a adopté un cygne noir comme logo, un clin d'œil à la théorie \n" + " explique le site Thinkerview. La marque a adopté un cygne noir comme logo, un clin d'œil à la théorie" +
" du cygne noir (expliquée dans cet article de Challenges), soit un événement qui a peu de \n" + " du cygne noir (expliquée dans cet article de Challenges), soit un événement qui a peu de" +
" chances de se produire mais qui, s'il se produit, a des conséquences considérables.\n" + " chances de se produire mais qui, s'il se produit, a des conséquences considérables." +
"\n" + "\n" +
" Les invités viennent d'horizons divers avec une petite préférence pour les \n" + " Les invités viennent d'horizons divers avec une petite préférence pour les" +
" intellectuels iconoclastes et les contestataires de tous bords, de l'ancien \n" + " intellectuels iconoclastes et les contestataires de tous bords, de l'ancien" +
" ministre grec Yanis Varoufakis à l'historien et essayiste Emmanuel Todd, en\n" + " ministre grec Yanis Varoufakis à l'historien et essayiste Emmanuel Todd, en" +
" passant par les journalistes Natacha Polony et Laurent Obertone ou encore \n" + " passant par les journalistes Natacha Polony et Laurent Obertone ou encore" +
" la coqueluche des \\\"gilets jaunes\\\" Etienne Chouard. \\\"On est au milieu de \n" + " la coqueluche des \\\"gilets jaunes\\\" Etienne Chouard. \\\"On est au milieu de" +
" toutes les communautés qui s'écharpent sur internet, de l'extrême droite à\n" + " toutes les communautés qui s'écharpent sur internet, de l'extrême droite à" +
" l'extrême gauche, explique Sky. On cherche à créer un terrain neutre pour \n" + " l'extrême gauche, explique Sky. On cherche à créer un terrain neutre pour" +
" que tout le monde puisse échanger.") " que tout le monde puisse échanger.")
) )
) )

@ -25,6 +25,6 @@ class ContenuMedia(id: Int, var titre: String, var lien: String) : Contenu(id) {
} }
override fun toString(): String { override fun toString(): String {
return "ContenuMedia(id=$id, typeContenu='$typeContenu', titre='$titre', lien='$lien')" return "$lien\n\n"
} }
} }

@ -15,6 +15,6 @@ class ContenuParagraphe(id: Int, var titre: String, var texte: String) : Contenu
} }
override fun toString(): String { override fun toString(): String {
return "ContenuParagraphe(id=$id, typeContenu='$typeContenu', titre='$titre', texte='$texte')" return "$texte \n\n"
} }
} }

@ -0,0 +1,24 @@
package com.example.veraxapplication.navigation
import androidx.compose.runtime.Composable
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.example.veraxapplication.MainActivity
@Composable
fun VeraxNavHost() {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "accueil"
){
composable(route="accueil"){
}
}
}

@ -22,11 +22,14 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import coil.compose.rememberImagePainter import coil.compose.rememberImagePainter
import com.example.veraxapplication.modele.articles.Article import com.example.veraxapplication.modele.articles.Article
import com.example.veraxapplication.modele.articles.contenus.ContenuMedia
import com.example.veraxapplication.modele.articles.contenus.ContenuParagraphe
import com.example.veraxapplication.ui.theme.Salmon import com.example.veraxapplication.ui.theme.Salmon
@Composable @Composable
@ -34,7 +37,7 @@ fun AffichageLesArticles(articles : List<Article>){
Column(modifier = Modifier.verticalScroll(rememberScrollState())){ Column(modifier = Modifier.verticalScroll(rememberScrollState())){
for(article in articles){ for(article in articles){
Box (Modifier.clickable { /*faut je regarde la doc*/ }){ Box (Modifier.clickable { /*faut je regarde la doc*/ }){
AffichageUnArticle(e = article) AffichageUnArticleInfo(e = article)
} }
} }
@ -42,7 +45,7 @@ fun AffichageLesArticles(articles : List<Article>){
} }
@Composable @Composable
fun AffichageUnArticle(e : Article){ fun AffichageUnArticleInfo(e : Article){
Column(modifier = Modifier Column(modifier = Modifier
.padding(7.dp) .padding(7.dp)
.border(width = 1.dp, color = Color.Black, shape = RoundedCornerShape(10.dp)) .border(width = 1.dp, color = Color.Black, shape = RoundedCornerShape(10.dp))
@ -63,9 +66,9 @@ fun AffichageUnArticle(e : Article){
.background(Salmon) .background(Salmon)
) { ) {
Column (modifier = Modifier.padding(15.dp)) { Column (modifier = Modifier.padding(15.dp)) {
Text(text = e.auteur, fontSize = 17.sp) Text(text = "Auteur : "+e.auteur, fontSize = 17.sp)
Text(text = e.description, fontSize = 17.sp) Text(text = "Description : "+e.description, fontSize = 17.sp)
Text(text = "Lecture Time: " + e.temps + " minutes", fontSize = 17.sp) Text(text = "Temps de lecture : "+e.temps+" minutes", fontSize = 17.sp)
} }
} }
Image( Image(
@ -95,6 +98,78 @@ fun AffichageUnArticle(e : Article){
} }
} }
@Composable
fun AfficherArticle(e : Article){
Column(modifier = Modifier
.verticalScroll(rememberScrollState())
.padding(7.dp)
.padding(5.dp)) {
Text(text = e.titre, fontFamily = FontFamily.Serif, fontSize = 30.sp)
Box(
modifier = Modifier
.padding(15.dp)
.border(width = 1.dp, color = Color.Black, shape = RoundedCornerShape(10.dp))
.clip(RoundedCornerShape(10.dp))
.background(Salmon)
) {
Column(modifier = Modifier.padding(15.dp)) {
Text(text = "Auteur : "+e.auteur, fontSize = 17.sp)
Text(text = "Description : "+e.description, fontSize = 17.sp)
Text(text = "Temps de lecture : " + e.temps + " minutes", fontSize = 17.sp)
}
}
Image(
painter = rememberImagePainter(
data = e.imagePrincipale
),
contentScale = ContentScale.Crop,
contentDescription = null,
modifier = Modifier
.size(350.dp)
.align(Alignment.CenterHorizontally)
.padding(5.dp, 35.dp)
)
Column (modifier = Modifier.align(Alignment.Start)){
for (text in e.contenus){
when(text){
is ContenuMedia -> {
Text(text = text.titre, fontSize = 20.sp, fontWeight = FontWeight.Bold)
when(text.typeContenu){
"image" -> {
Image(
painter = rememberImagePainter(
data = text.lien
),
contentScale = ContentScale.FillHeight ,
contentDescription = null,
modifier = Modifier
.size(350.dp)
.align(Alignment.CenterHorizontally)
.padding(5.dp, 35.dp)
)
}
"video" -> {
Text(text = "Ici une video ..."+ text.toString(), fontSize = 15.sp, textAlign = TextAlign.Start)
//faut je vois comment on fait pour inclure une video ...
}
}
}
is ContenuParagraphe ->{
Text(text = text.titre, fontSize = 20.sp, fontWeight = FontWeight.Bold)
Text(text = text.toString(), fontSize = 16.sp, textAlign = TextAlign.Start)
}
}
}
}
}
}
/* /*
@Composable @Composable
fun DisplayImage(image: String) { fun DisplayImage(image: String) {

@ -35,6 +35,7 @@ import androidx.compose.ui.unit.sp
import com.example.veraxapplication.R import com.example.veraxapplication.R
import com.example.veraxapplication.modele.articles.Article import com.example.veraxapplication.modele.articles.Article
import com.example.veraxapplication.ui.article.AffichageLesArticles import com.example.veraxapplication.ui.article.AffichageLesArticles
import com.example.veraxapplication.ui.article.AfficherArticle
import com.example.veraxapplication.ui.theme.Orange import com.example.veraxapplication.ui.theme.Orange
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@ -126,6 +127,8 @@ fun TopBarVerax(theme: List<String>, articles: List<Article>) {
) { ) {
AffichageLesArticles(articles = articles) AffichageLesArticles(articles = articles)
// AfficherArticle(articles.get(0));
} }
} }

Loading…
Cancel
Save