Compare commits

..

13 Commits

@ -65,6 +65,14 @@ dependencies {
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("androidx.navigation:navigation-compose:2.4.0-alpha08")
implementation ("com.squareup.okhttp3:logging-interceptor:4.9.1")
// Jetpack Compose
implementation("androidx.compose.ui:ui:1.6.4")
implementation ("androidx.compose.material:material:1.6.4")
implementation ("androidx.compose.ui:ui-tooling:1.6.4")
// ExoPlayer
implementation ("androidx.media3:media3-session:1.3.0") implementation ("androidx.media3:media3-session:1.3.0")
implementation("com.google.android.exoplayer:exoplayer-core:2.19.1") implementation("com.google.android.exoplayer:exoplayer-core:2.19.1")
implementation ("com.google.android.exoplayer:exoplayer-ui:2.19.1") implementation ("com.google.android.exoplayer:exoplayer-ui:2.19.1")

@ -1,28 +1,23 @@
package com.example.veraxapplication package com.example.veraxapplication
import ArticlesViewModel import ArticlesViewModel
import IUsersDataManager
import StubUsers
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.veraxapplication.modele.IArticlesDataManager import com.example.veraxapplication.articles.IArticlesDataManager
import com.example.veraxapplication.articles.StubArticles import com.example.veraxapplication.articles.StubArticles
import com.example.veraxapplication.modele.api.UsersViewModel
import com.example.veraxapplication.navigation.VeraxNavHost
import com.example.veraxapplication.ui.connexion.AfficherForm
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)
// doc compose, pleins de trucs: https://developer.android.com/jetpack/compose/text?hl=fr // doc compose, pleins de trucs: https://developer.android.com/jetpack/compose/text?hl=fr
//doc couleur background pas finie: https://developer.android.com/jetpack/compose/components/scaffold //doc couleur background pas finie: https://developer.android.com/jetpack/compose/components/scaffold
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@ -41,23 +36,17 @@ fun VeraxContent() {
var dataManager: IArticlesDataManager = StubArticles() var dataManager: IArticlesDataManager = StubArticles()
var articles = dataManager.getDerniersArticles(4) var articles = dataManager.getDerniersArticles(4)
var usersManager: IUsersDataManager = StubUsers()
var users = usersManager.getUsers();
// Observer les données du ViewModel // Observer les données du ViewModel
val articlesViewModel: ArticlesViewModel = viewModel() val articlesViewModel: ArticlesViewModel = viewModel()
// Observez les articles du ViewModel // Observez les articles du ViewModel
val articlesApi by articlesViewModel.articles.observeAsState(initial = articles) val articlesApi by articlesViewModel.articles.observeAsState(initial = articles)
val usersViewModel: UsersViewModel = viewModel()
val usersApi by usersViewModel.users.observeAsState(initial = users)
var theme = listOf("Economique", "Culture", "Politique", "Faits divers") var theme = listOf("Economique", "Culture", "Politique", "Faits divers")
TopBarVerax(articles = articlesApi, theme = theme)
TopBarVerax(articles = articlesApi, theme = theme, articlesStub= articles) // VeraxNavHost()
} }

@ -1,11 +0,0 @@
package com.example.veraxapplication.data
/*
data class Article(
var Title : String,
var Description : String,
var Image : String,
var Author : String,
var Content : List<Paragraph>,
var LectureTime : String
)
*/

@ -1,6 +0,0 @@
package com.example.veraxapplication.data
/*
data class Paragraph(
var Content : String,
)
*/

@ -0,0 +1,27 @@
package com.example.veraxapplication.modele
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object RetrofitClientUser {
private const val BASE_URL = "https://codefirst.iut.uca.fr/containers/Verax-verax-api"
val retrofit: Retrofit by lazy {
Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
// interface UserApiService {
// @GET("users")
// suspend fun getUsers() : List<User>
// }
}
object ApiClientUser {
val apiService: UserApiService by lazy {
RetrofitClientUser.retrofit.create(UserApiService::class.java)
}
}

@ -1,4 +1,4 @@
package com.example.veraxapplication.modele package com.example.veraxapplication.articles
import com.example.veraxapplication.modele.articles.Article import com.example.veraxapplication.modele.articles.Article

@ -0,0 +1,11 @@
package com.example.veraxapplication.modele
import com.example.veraxapplication.modele.user.User
import retrofit2.Call
import retrofit2.http.GET
interface UserApiService {
@GET("users/")
suspend fun getUsers(): Call<List<User>>
}

@ -23,6 +23,7 @@ data class ArticleDTO (
val imagePrincipale: String, val imagePrincipale: String,
@SerializedName("note") @SerializedName("note")
val note: String, val note: String,
) { ) {
fun toModel(): Article { fun toModel(): Article {
return Article( return Article(

@ -1,11 +0,0 @@
package com.example.veraxapplication.modele.api
import com.example.veraxapplication.modele.user.User
import retrofit2.Call
import retrofit2.http.GET
interface IUserService {
@GET("users")
suspend fun getUsers(): List<UserDTO>
}

@ -1,32 +0,0 @@
package com.example.veraxapplication.modele.api
import com.example.veraxapplication.modele.user.User
import com.google.gson.annotations.SerializedName
data class UserDTO (
@SerializedName("pseudo")
val pseudo: String,
@SerializedName("mdp")
val mdp: String,
@SerializedName("mail")
val mail: String,
@SerializedName("nom")
val nom: String,
@SerializedName("prenom")
val prenom: String,
@SerializedName("role")
val role: String,
) {
fun toModel(): User {
return User(
pseudo,
mdp,
mail,
nom,
prenom,
role,
)
}
}

@ -1,63 +0,0 @@
package com.example.veraxapplication.modele.api
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.veraxapplication.modele.articles.Article
import com.example.veraxapplication.modele.user.User
import kotlinx.coroutines.launch
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object RetrofitClientUser {
private const val BASE_URL = "https://codefirst.iut.uca.fr/containers/Verax-verax-api"
private val logging = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
private val httpClient = OkHttpClient.Builder().apply {
addInterceptor(logging)
}.build()
val retrofit: Retrofit by lazy {
Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
// interface UserApiService {
// @GET("users")
// suspend fun getUsers() : List<User>
// }
}
class UsersViewModel : ViewModel() {
private val _users = MutableLiveData<List<User>>()
val users: LiveData<List<User>> = _users
private val service = ArticleApiClient.retrofit.create(IUserService::class.java)
init {
loadUsers()
}
fun loadUsers() {
viewModelScope.launch {
try {
val usersDto = service.getUsers() // Pas besoin d'appeler .execute()
// Convertissez les DTO en modèles de données si nécessaire
_users.value = usersDto.map { it.toModel() }
} catch (e: Exception) {
Log.e("UsersViewModel", "Erreur lors du chargement des users", e)
}
}
}
}

@ -10,8 +10,8 @@ class Article(
val date: String, val date: String,
val auteur: String, val auteur: String,
val categorie: String, val categorie: String,
val imagePrincipale: String, val note: String,
val note: String val imagePrincipale: String
) { ) {
public val lContenus: MutableList<Contenu> = java.util.ArrayList() public val lContenus: MutableList<Contenu> = java.util.ArrayList()

@ -1,6 +1,5 @@
package com.example.veraxapplication.articles package com.example.veraxapplication.articles
import com.example.veraxapplication.modele.IArticlesDataManager
import com.example.veraxapplication.modele.articles.Article import com.example.veraxapplication.modele.articles.Article
import com.example.veraxapplication.modele.articles.contenus.Contenu import com.example.veraxapplication.modele.articles.contenus.Contenu
import com.example.veraxapplication.modele.articles.contenus.ContenuMedia import com.example.veraxapplication.modele.articles.contenus.ContenuMedia
@ -26,10 +25,10 @@ class StubArticles() : IArticlesDataManager {
"Thinkerview est une chaîne passionnante chaîne youtube d'interview-débat.", "Thinkerview est une chaîne passionnante chaîne youtube d'interview-débat.",
"3", "3",
"02/09/2024", "02/09/2024",
"Siwa", "Tony",
"Politique", "Politique",
"https://cdn.discordapp.com/attachments/1150826798549049554/1219554341388816437/stub1.webp?ex=660bb97d&is=65f9447d&hm=3e1e8d3372ae897fa4e2aa1ec730d976d74b35fce96cb8d78d6f9239e2836564&", "12",
"12" "https://cdn.discordapp.com/attachments/1150826798549049554/1219554341388816437/stub1.webp?ex=660bb97d&is=65f9447d&hm=3e1e8d3372ae897fa4e2aa1ec730d976d74b35fce96cb8d78d6f9239e2836564&"
) )
article1.remplirArticle(contenuMap["article1"]) article1.remplirArticle(contenuMap["article1"])
lArticles!!.add(article1) lArticles!!.add(article1)
@ -41,10 +40,10 @@ class StubArticles() : IArticlesDataManager {
"Revenons sur les différentes controverses à ce sujet.", "Revenons sur les différentes controverses à ce sujet.",
"7", "7",
"02/09/2024", "02/09/2024",
"Siwa", "Tony",
"Politique", "Politique",
"https://cdn.discordapp.com/attachments/1150826798549049554/1219555874339815454/stub2.webp?ex=660bbaea&is=65f945ea&hm=80aef945e8410b18395c716fdd19265608f7b1263731192d5c69f807fce9e944&", "12",
"12" "https://cdn.discordapp.com/attachments/1150826798549049554/1219555874339815454/stub2.webp?ex=660bbaea&is=65f945ea&hm=80aef945e8410b18395c716fdd19265608f7b1263731192d5c69f807fce9e944&"
) )
article2.remplirArticle(contenuMap["article5"]) article2.remplirArticle(contenuMap["article5"])
lArticles!!.add(article2) lArticles!!.add(article2)
@ -56,10 +55,11 @@ class StubArticles() : IArticlesDataManager {
"Pour réfuter la fausse croyance que la Terre est plate, il est essentiel de s'appuyer sur des preuves scientifiques et des observations historiques. ", "Pour réfuter la fausse croyance que la Terre est plate, il est essentiel de s'appuyer sur des preuves scientifiques et des observations historiques. ",
"5", "5",
"02/09/2024", "02/09/2024",
"Siwa", "Tony",
"Politique", "Politique",
"https://cdn.discordapp.com/attachments/1150826798549049554/1219547864196317225/stub1.webp?ex=660bb374&is=65f93e74&hm=a9e5dd48faa3ae68c358309af8949c46dfd4dea9c4d6e3d845d707784e5341cf&", "12",
"12"
"https://cdn.discordapp.com/attachments/1150826798549049554/1219547864196317225/stub1.webp?ex=660bb374&is=65f93e74&hm=a9e5dd48faa3ae68c358309af8949c46dfd4dea9c4d6e3d845d707784e5341cf&"
) )
article3.remplirArticle(contenuMap["article4"]) article3.remplirArticle(contenuMap["article4"])
lArticles!!.add(article3) lArticles!!.add(article3)
@ -71,10 +71,10 @@ class StubArticles() : IArticlesDataManager {
"Explorons les progrès remarquables dans le domaine de l'IA, les secteurs qu'elle révolutionne, et les implications éthiques majeures qu'elle soulève.", "Explorons les progrès remarquables dans le domaine de l'IA, les secteurs qu'elle révolutionne, et les implications éthiques majeures qu'elle soulève.",
"9", "9",
"02/09/2024", "02/09/2024",
"Luthen", "Tony",
"Politique", "Politique",
"https://cdn.discordapp.com/attachments/1150826798549049554/1219560686254817290/stub1.webp?ex=660bbf65&is=65f94a65&hm=021bd8c90c89347f31373468cc7a03ae15f1d3f9988a5b4325149c6df938d7bb&", "12",
"12" "https://cdn.discordapp.com/attachments/1150826798549049554/1219560686254817290/stub1.webp?ex=660bbf65&is=65f94a65&hm=021bd8c90c89347f31373468cc7a03ae15f1d3f9988a5b4325149c6df938d7bb&"
) )
article4.remplirArticle(contenuMap["article6"]) article4.remplirArticle(contenuMap["article6"])
lArticles!!.add(article4) lArticles!!.add(article4)

@ -1,78 +0,0 @@
import com.example.veraxapplication.modele.IArticlesDataManager
import com.example.veraxapplication.modele.articles.Article
import com.example.veraxapplication.modele.articles.contenus.Contenu
import com.example.veraxapplication.modele.articles.contenus.ContenuMedia
import com.example.veraxapplication.modele.articles.contenus.ContenuParagraphe
import com.example.veraxapplication.modele.user.User
class StubUsers() : IUsersDataManager {
private var lUsers: MutableList<User>? = null
init {
chargerUsers()
}
private fun chargerUsers() {
lUsers = java.util.ArrayList<User>()
val user1 = User (
"NoaSil",
"1234",
"",
"Sillard",
"Noa",
"Admin"
)
lUsers!!.add(user1)
val user2 = User (
"Sha",
"1234",
"",
"Cascarra",
"Shana",
"Admin"
)
lUsers!!.add(user2)
val user3 = User (
"TonyF",
"1234",
"tony@gmail.com",
"Fages",
"Tony",
"Admin"
)
lUsers!!.add(user3)
val user4 = User (
"JeanSwaggLaPuissance63",
"1234",
"jean.lapuissance@gmail.com",
"Marcillac",
"Jean",
"Admin"
)
lUsers!!.add(user4)
}
override val allUsers: List<User>?
get() = lUsers
override fun getUser(pseudo : String): User? {
println("Passage dans getUser avec comme pseudo : $pseudo")
lUsers?.let {
println("Nombre d'utilisateurs disponibles : ${it.size}")
val userARenvoyer: User? = it.find { user -> user.pseudo == pseudo }
return userARenvoyer
}
return null
}
override fun getUsers(): List<User>
{
return lUsers?.takeIf { it.isNotEmpty() }?.take(lUsers!!.size) ?: emptyList()
}
}

@ -1,3 +1,3 @@
package com.example.veraxapplication.modele.user package com.example.veraxapplication.modele.user
data class User(val pseudo : String, val mdp : String, val mail : String, val nom : String, val prenom : String, val role : String) data class User(val pseudo : String, val mdp : String, val mail : String, val nom : String, val prenom : String, val role : Char)

@ -1,18 +1,20 @@
package com.example.veraxapplication.navigation package com.example.veraxapplication.navigation
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.NavType import androidx.navigation.NavType
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument import androidx.navigation.navArgument
import com.example.veraxapplication.MainActivity
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.article.AfficherArticle
@Composable @Composable
fun VeraxNavHost(articles : List<Article>, navController: NavHostController, articlesStub: List<Article>) { fun VeraxNavHost(articles : List<Article>, navController: NavHostController) {
NavHost( NavHost(
@ -33,7 +35,7 @@ fun VeraxNavHost(articles : List<Article>, navController: NavHostController, art
arguments= listOf(navArgument("articleid"){ type= NavType.IntType}) arguments= listOf(navArgument("articleid"){ type= NavType.IntType})
){ ){
it.arguments?.getInt("articleid")?.let { articleid -> it.arguments?.getInt("articleid")?.let { articleid ->
articlesStub.find { it.id == articleid }?.let { articles.find { it.id == articleid }?.let {
AfficherArticle( AfficherArticle(
e = it e = it
) )

@ -6,13 +6,10 @@ import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
@ -32,7 +29,6 @@ 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.Contenu
import com.example.veraxapplication.modele.articles.contenus.ContenuMedia import com.example.veraxapplication.modele.articles.contenus.ContenuMedia
import com.example.veraxapplication.modele.articles.contenus.ContenuParagraphe import com.example.veraxapplication.modele.articles.contenus.ContenuParagraphe
import com.example.veraxapplication.ui.theme.Salmon import com.example.veraxapplication.ui.theme.Salmon
@ -69,6 +65,7 @@ fun AffichageUnArticleInfo(e : Article, goToArticle: (Article) -> Unit){
Text(text = "Temps de lecture : "+e.temps+" minutes", fontSize = 17.sp) Text(text = "Temps de lecture : "+e.temps+" minutes", fontSize = 17.sp)
} }
} }
Log.d("ImageLoad", e.toString())
Image( Image(
painter = rememberImagePainter( painter = rememberImagePainter(
data = e.imagePrincipale data = e.imagePrincipale
@ -97,19 +94,32 @@ fun AffichageUnArticleInfo(e : Article, goToArticle: (Article) -> Unit){
} }
} }
@Composable @Composable
fun AfficherArticle(e : Article) { fun AfficherArticle(e : Article) {
Column(modifier = Modifier Column(
modifier = Modifier
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
.padding(7.dp) .padding(7.dp)
.padding(5.dp)) { .padding(5.dp)
) {
Text(text = e.titre, fontFamily = FontFamily.Serif, fontSize = 30.sp) Text(text = e.titre, fontFamily = FontFamily.Serif, fontSize = 30.sp)
// Affichage des informations de l'article Box(
DisplayHeader(author = e.auteur, description = e.description, lectureTime = e.temps) 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( Image(
painter = rememberImagePainter( painter = rememberImagePainter(
data = e.imagePrincipale data = e.imagePrincipale
@ -123,11 +133,51 @@ fun AfficherArticle(e : Article){
) )
// Affichage contenus
DisplayContenu(e.lContenus)
Column(modifier = Modifier) {
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
)
// le player video marche a moitié mais honnetenement je comprends pas le soucis
VideoPlayer(videoUrl = text.lien)
}
}
}
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 DisplayHeader(author: String, description: String, lectureTime: String) { fun DisplayHeader(author: String, description: String, lectureTime: String) {
@ -146,44 +196,17 @@ fun DisplayHeader(author: String, description: String, lectureTime: String) {
} }
} }
@Composable @Composable
fun DisplayContenu(contenus: List<Contenu>) { fun DisplayImage(imageURl : String){
Column(horizontalAlignment = Alignment.CenterHorizontally) { Log.d("ImageLoad", "URL de l'image reçue de l'API : $imageURl")
for (contenu in contenus) {
when (contenu) {
is ContenuMedia -> {
Log.d("Img", contenu.titre + " " + contenu.lien)
Text(text = contenu.titre, fontSize = 20.sp, fontWeight = FontWeight.Bold)
when (contenu.typeContenu) {
"image" -> {
Image( Image(
painter = rememberImagePainter(data = contenu.lien), painter = rememberImagePainter(
contentScale = ContentScale.FillHeight, data = imageURl
),
contentScale = ContentScale.Crop,
contentDescription = null, contentDescription = null,
modifier = Modifier modifier = Modifier
.size(350.dp) .size(350.dp)
.padding(5.dp, 35.dp) .padding(5.dp, 35.dp)
.fillMaxWidth()
.wrapContentWidth(Alignment.CenterHorizontally) // Centrer l'image
) )
} }
"video" -> {
Text(
text = "Ici une video ..." + contenu.toString(),
fontSize = 15.sp,
textAlign = TextAlign.Start
)
VideoPlayer(videoUrl = contenu.lien)
}
}
}
is ContenuParagraphe -> {
Text(text = contenu.titre, fontSize = 20.sp, fontWeight = FontWeight.Bold)
Text(text = contenu.texte, fontSize = 16.sp, textAlign = TextAlign.Start)
}
}
}
}
}

@ -1,3 +1,4 @@
import android.view.ViewGroup import android.view.ViewGroup
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable

@ -1,23 +0,0 @@
package com.example.veraxapplication.ui.connexion
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.example.veraxapplication.modele.user.User
@Composable
fun AfficherForm(users : List<User>) {
var pseudo = "DEFAULT"
var mdp = "DEFAULT"
Column {
TextField(value = "Pseudo", onValueChange = { value -> pseudo = value }, modifier = Modifier.padding(5.dp))
TextField(value = "Mot de passe", onValueChange = { value -> mdp = value }, modifier = Modifier.padding(5.dp))
for (u in users) {
Text(text = u.pseudo)
}
}
}

@ -42,8 +42,10 @@ import com.example.veraxapplication.ui.theme.Orange
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun TopBarVerax(theme: List<String>, articles: List<Article>, articlesStub : List<Article>) { fun TopBarVerax(theme: List<String>, articles: List<Article>) {
/*var leMenu by remember { mutableStateOf(false) }*/ var leMenu by remember {
mutableStateOf(false)
}
val navController = rememberNavController() val navController = rememberNavController()
@ -55,11 +57,12 @@ fun TopBarVerax(theme: List<String>, articles: List<Article>, articlesStub : Lis
CenterAlignedTopAppBar( CenterAlignedTopAppBar(
title = { title = {
Text( Text(
//text = R.string.app_name,
text = "Verax", text = "Verax",
style = TextStyle(fontSize = 35.sp), style = TextStyle(fontSize = 35.sp),
color = colorResource(R.color.red), color = colorResource(R.color.red),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
/*backcolor = topAppBarColors(
containerColor = MaterialTheme.colorScheme.primaryContainer),*/ //version recommandée par le prof
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
}, },
@ -73,7 +76,7 @@ fun TopBarVerax(theme: List<String>, articles: List<Article>, articlesStub : Lis
} }
} }
}/*, },
actions = { actions = {
IconButton(onClick = { leMenu = !leMenu }) { IconButton(onClick = { leMenu = !leMenu }) {
Icon( Icon(
@ -102,14 +105,33 @@ fun TopBarVerax(theme: List<String>, articles: List<Article>, articlesStub : Lis
.padding(10.dp) .padding(10.dp)
) )
}, },
onClick = { } onClick = { /* faut un moyen d'appeler une methode diff pour chaque, ca doit etre faisable facilement */ }
) )
} }
} }
}*/ }
) )
}/*,
bottomBar = {
// Faudrait pouvoir faire un flex sur les boutons parce que là ils sont juste côte à côte
BottomAppBar(containerColor = Color.Black, contentColor = Color.White) {
IconButton(onClick = { /*TODO*/ }) {
Icon(
imageVector = Icons.Filled.Home,
contentDescription = "Home",
Modifier.size(35.dp)
)
} }
IconButton(onClick = { /*TODO*/ }) {
Icon(
imageVector = Icons.Filled.Person,
contentDescription = "Account",
Modifier.size(35.dp)
)
}
}
}*/
) { innerPadding -> ) { innerPadding ->
Column( Column(
modifier = Modifier modifier = Modifier
@ -117,7 +139,11 @@ fun TopBarVerax(theme: List<String>, articles: List<Article>, articlesStub : Lis
verticalArrangement = Arrangement.spacedBy(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp),
) { ) {
VeraxNavHost(articles = articles, navController, articlesStub= articlesStub) // AffichageLesArticles(articles = articles)
// AfficherArticle(articles.get(0))
VeraxNavHost(articles = articles, navController)
} }
} }

@ -1,3 +1,3 @@
<resources> <resources>
<string name="app_name">Verax</string> <string name="app_name">VeraxApplication</string>
</resources> </resources>

@ -2,6 +2,5 @@
<network-security-config> <network-security-config>
<domain-config cleartextTrafficPermitted="true"> <domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">181.214.189.133</domain> <domain includeSubdomains="true">181.214.189.133</domain>
<domain includeSubdomains="true">codefirst.iut.uca.fr/containers/Verax-verax-api</domain>
</domain-config> </domain-config>
</network-security-config> </network-security-config>
Loading…
Cancel
Save