Page d'affichage d'1 article

navigationHost
Shana CASCARRA 3 months ago
parent c2abb90896
commit 2818828c3c

@ -59,12 +59,15 @@ dependencies {
implementation("androidx.core:core-ktx:1.10.1")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1")
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("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material3:material3")
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")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
@ -75,4 +78,5 @@ dependencies {
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.StubArticles
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
// 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 color = Color(0xFF00FF00)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -36,16 +38,11 @@ class MainActivity : ComponentActivity() {
//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,12 +88,12 @@ class StubArticles() : IArticlesDataManager {
article1Contenus.add(
ContenuParagraphe(
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" +
" médiatique. Ambiance Star Wars. Après une musique lancinante, sur fond noir et fumée grisâtre,\n" +
" un invité apparaît, et la voix dun intervieweur-mystère situé hors champ linvite à se\n" +
" présenter « succinctement ». Cest ainsi quon entre dans le monde de ThinkerView, \n" +
" chaîne qui a commencé à diffuser en janvier 2013 sur YouTube. Ici, pas de publicité,\n" +
" pas de montage, pas deffets de lumière. Le calme, peut-être pour annoncer la tempête."
"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," +
" 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," +
" 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."
)
)
article1Contenus.add(
@ -106,14 +106,14 @@ class StubArticles() : IArticlesDataManager {
article1Contenus.add(
ContenuParagraphe(
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" +
" jaune Maxime Nicolle et « conseiller juridique » de Wikileaks. Quelques jours avant lui,\n" +
" cétait au tour de François Boulo, autre avocat inscrit au barreau de Rouen et lun des\n" +
" porte-parole des « gilets jaunes ». « Ici, les gens ont vraiment le temps de développer \n" +
" leurs idées, confie Boulo. Il faut pouvoir écouter une pensée complète, sans être interrompu.\n" +
" » Aux yeux de ce fils dune famille de droite populaire (paysans et commerçants), ThinkerView \n" +
" a réalisé ce dont Pierre Bourdieu avait rêvé. Sil sabreuve à cette source depuis « un an ou \n" +
" deux », en réalité, ce nest pas lui qui la trouvée, mais linverse. Magie des algorithmes.")
("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," +
" 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" +
" 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" +
" 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.")
)
)
article1Contenus.add(
@ -126,19 +126,19 @@ class StubArticles() : IArticlesDataManager {
article1Contenus.add(
ContenuParagraphe(
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" +
" explique le site Thinkerview. La marque a adopté un cygne noir comme logo, un clin d'œil à la théorie \n" +
" du cygne noir (expliquée dans cet article de Challenges), soit un événement qui a peu de \n" +
" chances de se produire mais qui, s'il se produit, a des conséquences considérables.\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" +
" 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" +
" Les invités viennent d'horizons divers avec une petite préférence pour les \n" +
" intellectuels iconoclastes et les contestataires de tous bords, de l'ancien \n" +
" ministre grec Yanis Varoufakis à l'historien et essayiste Emmanuel Todd, en\n" +
" passant par les journalistes Natacha Polony et Laurent Obertone ou encore \n" +
" la coqueluche des \\\"gilets jaunes\\\" Etienne Chouard. \\\"On est au milieu de \n" +
" toutes les communautés qui s'écharpent sur internet, de l'extrême droite à\n" +
" l'extrême gauche, explique Sky. On cherche à créer un terrain neutre pour \n" +
" que tout le monde puisse échanger.")
" 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" +
" ministre grec Yanis Varoufakis à l'historien et essayiste Emmanuel Todd, en" +
" passant par les journalistes Natacha Polony et Laurent Obertone ou encore" +
" 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 à" +
" l'extrême gauche, explique Sky. On cherche à créer un terrain neutre pour" +
" que tout le monde puisse échanger.")
)
)
article1Contenus.add(

@ -25,6 +25,6 @@ class ContenuMedia(id: Int, var titre: String, var lien: String) : Contenu(id) {
}
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 {
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.layout.ContentScale
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.unit.dp
import androidx.compose.ui.unit.sp
import coil.compose.rememberImagePainter
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
@Composable
@ -34,7 +37,7 @@ fun AffichageLesArticles(articles : List<Article>){
Column(modifier = Modifier.verticalScroll(rememberScrollState())){
for(article in articles){
Box (Modifier.clickable { /*faut je regarde la doc*/ }){
AffichageUnArticle(e = article)
AffichageUnArticleInfo(e = article)
}
}
@ -42,7 +45,7 @@ fun AffichageLesArticles(articles : List<Article>){
}
@Composable
fun AffichageUnArticle(e : Article){
fun AffichageUnArticleInfo(e : Article){
Column(modifier = Modifier
.padding(7.dp)
.border(width = 1.dp, color = Color.Black, shape = RoundedCornerShape(10.dp))
@ -63,9 +66,9 @@ fun AffichageUnArticle(e : Article){
.background(Salmon)
) {
Column (modifier = Modifier.padding(15.dp)) {
Text(text = e.auteur, fontSize = 17.sp)
Text(text = e.description, fontSize = 17.sp)
Text(text = "Lecture Time: " + e.temps + " minutes", fontSize = 17.sp)
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(
@ -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
fun DisplayImage(image: String) {

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

Loading…
Cancel
Save