From 8fe24d65402a6271bba007ffc5558c5a77310eae Mon Sep 17 00:00:00 2001 From: Antoine Jourdain Date: Thu, 28 Mar 2024 09:51:43 +0100 Subject: [PATCH 1/2] =?UTF-8?q?avanc=C3=A9=20sur=20vocabulary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/sae/android/sae_2a/MainActivity.kt | 4 +- .../sae/android/sae_2a/data/Vocabulary.kt | 2 +- .../sae/android/sae_2a/view/HomeScreen.kt | 2 +- .../sae_2a/view/VocabularyListScreen.kt | 118 +++++++++++++++++- .../app/src/main/res/values/strings.xml | 2 +- 5 files changed, 119 insertions(+), 9 deletions(-) diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/MainActivity.kt b/Project/android/app/src/main/java/sae/android/sae_2a/MainActivity.kt index 749a0c0..472056a 100644 --- a/Project/android/app/src/main/java/sae/android/sae_2a/MainActivity.kt +++ b/Project/android/app/src/main/java/sae/android/sae_2a/MainActivity.kt @@ -11,6 +11,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview +import sae.android.sae_2a.game.VocabularyScreen +import sae.android.sae_2a.view.MyApp import sae.android.sae_2a.ui.theme.SAE_2ATheme import sae.android.sae_2a.view.PreviewLoginScreen @@ -18,7 +20,7 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { - PreviewLoginScreen() + MyApp() } } } diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/data/Vocabulary.kt b/Project/android/app/src/main/java/sae/android/sae_2a/data/Vocabulary.kt index 629dea2..36bf9ba 100644 --- a/Project/android/app/src/main/java/sae/android/sae_2a/data/Vocabulary.kt +++ b/Project/android/app/src/main/java/sae/android/sae_2a/data/Vocabulary.kt @@ -3,5 +3,5 @@ package sae.android.sae_2a.data data class Vocabulary( val name: String, val aut: String?, - val listWord: Map + val words: Map ) \ No newline at end of file diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/view/HomeScreen.kt b/Project/android/app/src/main/java/sae/android/sae_2a/view/HomeScreen.kt index 5727813..6602b25 100644 --- a/Project/android/app/src/main/java/sae/android/sae_2a/view/HomeScreen.kt +++ b/Project/android/app/src/main/java/sae/android/sae_2a/view/HomeScreen.kt @@ -33,7 +33,7 @@ fun MyApp() { val navController = rememberNavController() NavHost(navController, startDestination = "HomeScreen") { composable("HomeScreen") { HomeScreen( NavigateToRegister = { navController.navigate("RegisterScreen")} ,NavigateToLogin = { navController.navigate("VocabularyScreen") }) } - composable("VocabularyScreen") { VocabularyScreen(onNavigateToList = { navController.navigate("HomeScreen") }) } + composable("VocabularyScreen") { VocabularyScreen(onNavigateToList = { navController.popBackStack() }) } composable("RegisterScreen") { RegisterScreen(NavigateToApp = { navController.navigate("VocabularyScreen") }) } } diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/view/VocabularyListScreen.kt b/Project/android/app/src/main/java/sae/android/sae_2a/view/VocabularyListScreen.kt index 86c93f0..2c281e8 100644 --- a/Project/android/app/src/main/java/sae/android/sae_2a/view/VocabularyListScreen.kt +++ b/Project/android/app/src/main/java/sae/android/sae_2a/view/VocabularyListScreen.kt @@ -1,10 +1,13 @@ package sae.android.sae_2a.game import android.widget.GridLayout +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize @@ -19,8 +22,11 @@ import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyGridScope import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -34,21 +40,39 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.sp +import androidx.navigation.compose.rememberNavController import sae.android.sae_2a.R @Composable -fun VocabularyScreen(onNavigateToList: () -> Unit){ +fun VocabularyScreen(onNavigateToList: () -> Unit, onNavigateToDetails: (Vocabulary) -> Unit = {}){ val vocabulary = listOf( - Vocabulary("test","Autheur", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), - Vocabulary("test2","Autheur2", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")) + Vocabulary("test","Auteur", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test2","Auteur2", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test","Auteur", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test2","Auteur2", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test","Auteur", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test2","Auteur2", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test","Auteur", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test2","Auteur2", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test","Auteur", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test2","Auteur2", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test","Auteur", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test2","Auteur2", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test","Auteur", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test2","Auteur2", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test","Auteur", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test2","Auteur2", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test","Auteur", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), + Vocabulary("test2","Auteur2", hashMapOf("Fromage" to "Cheese", "Pomme" to "Apple")), ) - DisplayLists(vocabulary) + DisplayLists(vocabulary, onNavigateToDetails) } @Composable -fun DisplayLists(vocabulary: List) { +fun DisplayLists(vocabulary: List, onCardClick: (Vocabulary) -> Unit = {}){ LazyVerticalGrid( columns = GridCells.Adaptive(150.dp), horizontalArrangement = Arrangement.spacedBy(10.dp), + contentPadding = PaddingValues(10.dp), verticalArrangement = Arrangement.spacedBy(10.dp)) { items(vocabulary.size) { voc -> VocCard(vocabulary[voc]) @@ -58,9 +82,12 @@ fun DisplayLists(vocabulary: List) { } +@OptIn(ExperimentalMaterial3Api::class) @Composable fun VocCard(vocabulary: Vocabulary){ Card(shape = RectangleShape, + onClick = { + }, modifier = Modifier .size(150.dp, 150.dp) .border(2.dp, Color.DarkGray, shape = RoundedCornerShape(8.dp, 8.dp))) { @@ -93,4 +120,85 @@ fun PreviewCard(){ laMap["Fromage"] = "Cheese" laMap["Pomme"] = "Apple" VocCard(Vocabulary("test","Autheur", laMap)) +} + +@Preview +@Composable +fun PreviewVocabularyScreen(){ + VocabularyScreen({}) +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun VocabularyDetails(vocabulary: Vocabulary){ + LazyColumn(modifier = Modifier.fillMaxSize()) { + stickyHeader( + ) { + Text( + vocabulary.name, fontSize = 30.sp, + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth() + ) + Text( + stringResource(R.string.created_by) + (vocabulary.aut + ?: stringResource(id = R.string.unknown)), + fontSize = 20.sp, + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth() + ) + } + vocabulary.words.forEach { (key, value) -> + item { + WordCard(key, value) + } + } + } +} + +@Composable +fun WordCard(key: String, value: String) { + Row { + Card( + modifier = Modifier + .fillMaxWidth() + .padding(10.dp) + .weight(0.5f) + ) { + Text(text = key, fontSize = 30.sp, + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth()) + } + Card( + modifier = Modifier + .fillMaxWidth() + .padding(10.dp) + .weight(0.5f) + ) { + Text(text = value, fontSize = 30.sp, + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth()) + } + } +} + +@Preview +@Composable +fun PreviewVocabularyDetails(){ + val laMap = HashMap() + laMap["Fromage"] = "Cheese" + laMap["Pomme"] = "Apple" + laMap["Pain"] = "Bread" + laMap["Eau"] = "Water" + laMap["Lait"] = "Milk" + laMap["Beurre"] = "Butter" + laMap["Sucre"] = "Sugar" + laMap["Sel"] = "Salt" + laMap["Poivre"] = "Pepper" + laMap["Farine"] = "Flour" + laMap["Oeuf"] = "Egg" + laMap["Viande"] = "Meat" + laMap["Poisson"] = "Fish" + laMap["Légume"] = "Vegetable" + laMap["Fruit"] = "Fruit" + VocabularyDetails(Vocabulary("test","Autheur", laMap)) } \ No newline at end of file diff --git a/Project/android/app/src/main/res/values/strings.xml b/Project/android/app/src/main/res/values/strings.xml index 10230af..517dc2b 100644 --- a/Project/android/app/src/main/res/values/strings.xml +++ b/Project/android/app/src/main/res/values/strings.xml @@ -6,6 +6,6 @@ Log Out Password Picture representing vocabulary - Created by + Created by\u0020 Unknown \ No newline at end of file From b8594cb90211589f2d42178250c00bde053dc975 Mon Sep 17 00:00:00 2001 From: "patrick.brugiere" Date: Thu, 28 Mar 2024 12:03:49 +0100 Subject: [PATCH 2/2] avancer et debut de travail sur la bottomNavBar --- Project/android/app/build.gradle.kts | 4 +- .../sae/android/sae_2a/VM/GameViewModel.kt | 21 +++++ .../main/java/sae/android/sae_2a/data/Game.kt | 5 ++ .../sae/android/sae_2a/view/GameScreen.kt | 76 +++++++++++++++++++ .../sae/android/sae_2a/view/HomeScreen.kt | 57 +++++++++----- 5 files changed, 142 insertions(+), 21 deletions(-) create mode 100644 Project/android/app/src/main/java/sae/android/sae_2a/VM/GameViewModel.kt create mode 100644 Project/android/app/src/main/java/sae/android/sae_2a/data/Game.kt create mode 100644 Project/android/app/src/main/java/sae/android/sae_2a/view/GameScreen.kt diff --git a/Project/android/app/build.gradle.kts b/Project/android/app/build.gradle.kts index fac4187..1472c13 100644 --- a/Project/android/app/build.gradle.kts +++ b/Project/android/app/build.gradle.kts @@ -40,7 +40,7 @@ android { compose = true } composeOptions { - kotlinCompilerExtensionVersion = "1.5.1" + kotlinCompilerExtensionVersion = "1.5.11" } packaging { resources { @@ -50,7 +50,7 @@ android { } dependencies { - + implementation("androidx.compose.material:material:1.6.4") implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") implementation("androidx.activity:activity-compose:1.7.0") diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/VM/GameViewModel.kt b/Project/android/app/src/main/java/sae/android/sae_2a/VM/GameViewModel.kt new file mode 100644 index 0000000..6daf3a0 --- /dev/null +++ b/Project/android/app/src/main/java/sae/android/sae_2a/VM/GameViewModel.kt @@ -0,0 +1,21 @@ +package sae.android.sae_2a.VM + +import android.text.Spannable.Factory +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.MutableStateFlow +import sae.android.sae_2a.data.Game + +class GameViewModel : ViewModel() { + + + + + + + +} \ No newline at end of file diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/data/Game.kt b/Project/android/app/src/main/java/sae/android/sae_2a/data/Game.kt new file mode 100644 index 0000000..8a5d978 --- /dev/null +++ b/Project/android/app/src/main/java/sae/android/sae_2a/data/Game.kt @@ -0,0 +1,5 @@ +package sae.android.sae_2a.data + +data class Game( + val name: String +) \ No newline at end of file diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/view/GameScreen.kt b/Project/android/app/src/main/java/sae/android/sae_2a/view/GameScreen.kt new file mode 100644 index 0000000..8bbf30f --- /dev/null +++ b/Project/android/app/src/main/java/sae/android/sae_2a/view/GameScreen.kt @@ -0,0 +1,76 @@ +package sae.android.sae_2a.view + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.paddingFrom +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.Button +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.AlignmentLine +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import sae.android.sae_2a.data.Game +import sae.android.sae_2a.data.Vocabulary +import sae.android.sae_2a.game.DisplayLists + +@Composable +fun GameScreen(NavigateToApp: () -> Unit ){ + val game = listOf( + Game("Quizz"), + Game("Memory"), + Game("Asteroid"), + Game("Flashcard"), + ) + + + Surface(modifier = Modifier + .wrapContentWidth(align = Alignment.CenterHorizontally) + .wrapContentHeight(align = Alignment.CenterVertically) + .fillMaxSize(),) { + Column( modifier = Modifier + .background(color = Color.LightGray) + .wrapContentWidth(align = Alignment.CenterHorizontally)) { + + Text(text = "Games", fontSize = 32.sp ,modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(vertical = 100.dp) + ) + + ListGame(games =game ) + + } + } + +} + +@Composable +fun ListGame(games : List){ + LazyColumn(){ + items( games.size ){ + DisplayGame(games[it]) + } + } +} + +@Composable +fun DisplayGame(game :Game){ + Button(onClick = { },modifier = Modifier + .padding(15.dp) + .width(150.dp) + .height(80.dp)) { + Text(text = game.name, fontSize = 20.sp) + } +} \ No newline at end of file diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/view/HomeScreen.kt b/Project/android/app/src/main/java/sae/android/sae_2a/view/HomeScreen.kt index 6602b25..2b45163 100644 --- a/Project/android/app/src/main/java/sae/android/sae_2a/view/HomeScreen.kt +++ b/Project/android/app/src/main/java/sae/android/sae_2a/view/HomeScreen.kt @@ -10,7 +10,10 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.material.BottomNavigation +import androidx.compose.material.BottomNavigationItem import androidx.compose.material3.Button +import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -27,30 +30,46 @@ import androidx.navigation.compose.rememberNavController import sae.android.sae_2a.R import sae.android.sae_2a.game.VocabularyScreen - @Composable fun MyApp() { val navController = rememberNavController() +/* Scaffold( + bottomBar = { + BottomNavigation { + BottomNavigationItem(selected = , onClick = { /*TODO*/ }, icon = { /*TODO*/ }){ + + } + } + } + )*/ NavHost(navController, startDestination = "HomeScreen") { - composable("HomeScreen") { HomeScreen( NavigateToRegister = { navController.navigate("RegisterScreen")} ,NavigateToLogin = { navController.navigate("VocabularyScreen") }) } + composable("HomeScreen") { HomeScreen( NavigateToRegister = { navController.navigate("RegisterScreen")} ,NavigateToLogin = { navController.navigate("GameScreen") }) } composable("VocabularyScreen") { VocabularyScreen(onNavigateToList = { navController.popBackStack() }) } composable("RegisterScreen") { RegisterScreen(NavigateToApp = { navController.navigate("VocabularyScreen") }) } + composable("GameScreen"){ GameScreen() { +// + } } + } + } +@Composable +fun BottomNav(){ +} @Composable fun HomeScreen(NavigateToRegister: () -> Unit,NavigateToLogin: () -> Unit ){ Surface(modifier = Modifier - .wrapContentWidth(align = Alignment.CenterHorizontally) - .wrapContentHeight(align = Alignment.CenterVertically) - .fillMaxSize(),) { + .wrapContentWidth(align = Alignment.CenterHorizontally) + .wrapContentHeight(align = Alignment.CenterVertically) + .fillMaxSize(),) { Column( modifier = Modifier - .background(color = Color.Gray) - .wrapContentWidth(align = Alignment.CenterHorizontally)){ + .background(color = Color.Gray) + .wrapContentWidth(align = Alignment.CenterHorizontally)){ Image( painter = painterResource(id = R.drawable.logo), contentDescription = "Description de l'image", @@ -61,25 +80,25 @@ fun HomeScreen(NavigateToRegister: () -> Unit,NavigateToLogin: () -> Unit ){ .size(width = 200.dp, height = 200.dp) ) Text(text ="InEnglishPlease", color = Color.White, fontSize = 30.sp, fontWeight = FontWeight(1000) , modifier = Modifier - .padding(40.dp) - .wrapContentHeight(align = Alignment.Top) - .wrapContentWidth(align = Alignment.CenterHorizontally) - .align(alignment = Alignment.CenterHorizontally)) + .padding(40.dp) + .wrapContentHeight(align = Alignment.Top) + .wrapContentWidth(align = Alignment.CenterHorizontally) + .align(alignment = Alignment.CenterHorizontally)) Button( onClick = { NavigateToLogin() }, modifier = Modifier - .padding(30.dp) - .width(150.dp) - .height(80.dp) - .align(alignment = Alignment.CenterHorizontally)) { + .padding(30.dp) + .width(150.dp) + .height(80.dp) + .align(alignment = Alignment.CenterHorizontally)) { Text(text = "Login", fontSize = 20.sp) } Button(onClick = { NavigateToRegister() },modifier = Modifier - .padding(30.dp) - .width(150.dp) - .height(80.dp) - .align(alignment = Alignment.CenterHorizontally)) { + .padding(30.dp) + .width(150.dp) + .height(80.dp) + .align(alignment = Alignment.CenterHorizontally)) { Text(text = "Register", fontSize = 20.sp) } }