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/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/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/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/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 50696c9..7f8b476 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 @@ -28,19 +31,36 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import sae.android.sae_2a.R import sae.android.sae_2a.game.VocabularyScreen - @Preview + @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("VocabularyScreen") { VocabularyScreen(onNavigateToList = { navController.navigate("HomeScreen") }) } + 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 ){ @@ -63,7 +83,7 @@ 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(70.dp) + .padding(40.dp) .wrapContentHeight(align = Alignment.Top) .wrapContentWidth(align = Alignment.CenterHorizontally) .align(alignment = Alignment.CenterHorizontally)) 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 42396da..e3f848f 100644 --- a/Project/android/app/src/main/res/values/strings.xml +++ b/Project/android/app/src/main/res/values/strings.xml @@ -7,7 +7,7 @@ Sign In Password Picture representing vocabulary - Created by + Created by\u0020 Unknown Profile Picture Home