From ac819c7169151f0647b80a6bba1583645e6d84ff Mon Sep 17 00:00:00 2001 From: "vivien.dufour" Date: Wed, 13 Mar 2024 17:35:32 +0100 Subject: [PATCH 1/6] beginning of home page (with same design as website for now) --- .../main/java/com/iqball/app/MainActivity.kt | 3 +- .../main/java/com/iqball/app/page/HomePage.kt | 139 ++++++++++++++++++ .../java/com/iqball/app/ui/theme/Color.kt | 4 +- app/src/main/res/values/strings.xml | 1 + gradle/libs.versions.toml | 2 +- 5 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/iqball/app/page/HomePage.kt diff --git a/app/src/main/java/com/iqball/app/MainActivity.kt b/app/src/main/java/com/iqball/app/MainActivity.kt index 964daee..f7b697b 100644 --- a/app/src/main/java/com/iqball/app/MainActivity.kt +++ b/app/src/main/java/com/iqball/app/MainActivity.kt @@ -13,6 +13,7 @@ import com.google.gson.GsonBuilder import com.iqball.app.api.EitherBodyConverter import com.iqball.app.api.EitherCallAdapterFactory import com.iqball.app.api.service.IQBallService +import com.iqball.app.page.DisplayHomePage import com.iqball.app.page.RegisterPage import com.iqball.app.ui.theme.IQBallTheme import okhttp3.OkHttpClient @@ -56,5 +57,5 @@ class MainActivity : ComponentActivity() { @Composable fun App(service: IQBallService) { - RegisterPage(service) + DisplayHomePage() } \ No newline at end of file diff --git a/app/src/main/java/com/iqball/app/page/HomePage.kt b/app/src/main/java/com/iqball/app/page/HomePage.kt new file mode 100644 index 0000000..4d7b3d8 --- /dev/null +++ b/app/src/main/java/com/iqball/app/page/HomePage.kt @@ -0,0 +1,139 @@ +package com.iqball.app.page + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Divider +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.graphics.RectangleShape +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.iqball.app.R +import com.iqball.app.ui.theme.Orange + +@Preview +@Composable +fun DisplayHomePage() { + HomePage() +} + +@Composable +fun HomePage() { + Column { + AppHeader() + PersonalSpace() + PersonalSpaceMenu() + } +} + +@Composable +fun AppHeader() { + Box( + modifier = Modifier + .background(Color.DarkGray) + .fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + Row { + Text( + text = stringResource(R.string.app_name), + color = Orange, + fontWeight = FontWeight.Bold, + fontSize = 25.sp + ) + //rajouter petit bonhomme avec le nom + } + } +} + +@Composable +fun PersonalSpace() { + Box( + modifier = Modifier + .background(Color.Gray) + .fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Text( + text = stringResource(R.string.espace_personnel), + color = Color.White, + fontWeight = FontWeight.Bold, + fontSize = 15.sp, + modifier = Modifier.padding(5.dp) + ) + Box( + modifier = Modifier + .border(2.dp, Color.Black, RoundedCornerShape(5.dp)) + .fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + Text( + text = "Aucune tactique créée !", + fontSize = 10.sp, + modifier = Modifier.padding(5.dp) + ) + } + } + } +} + +@Composable +fun PersonalSpaceMenu() { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.LightGray) + ) { + Column { + Row { + Row { + Box( + modifier = Modifier + .background(Color.DarkGray) + .padding(5.dp) + ) { + Text(text = "Mes équipes") + } + Divider( + modifier = Modifier.align(Alignment.Bottom), + color = Color.DarkGray, + thickness = 3.dp + ) + //ajouter button add si jamais on fait ajout team en android + } + + } + Row { + Box( + modifier = Modifier + .background(Color.DarkGray) + .padding(5.dp) + ) { + Text(text = "Mes dernières stratégies") + } + Divider( + modifier = Modifier.align(Alignment.Bottom), + color = Color.DarkGray, + thickness = 3.dp + ) + + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/iqball/app/ui/theme/Color.kt b/app/src/main/java/com/iqball/app/ui/theme/Color.kt index 6b01d6c..25acc52 100644 --- a/app/src/main/java/com/iqball/app/ui/theme/Color.kt +++ b/app/src/main/java/com/iqball/app/ui/theme/Color.kt @@ -8,4 +8,6 @@ val Pink80 = Color(0xFFEFB8C8) val Purple40 = Color(0xFF6650a4) val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) \ No newline at end of file +val Pink40 = Color(0xFF7D5260) + +val Orange = Color(0xFFFF8000) \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1c64d05..46b279f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,4 @@ IQBall + Espace Personnel \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9c53489..f10c49e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.3.0" +agp = "8.2.2" arrowCore = "1.2.1" converterGson = "2.9.0" kotlin = "1.9.0" -- 2.36.3 From 3f4148cf89fe86d8c6e63f27dc6c1c6641208c9f Mon Sep 17 00:00:00 2001 From: d_yanis Date: Tue, 26 Mar 2024 20:15:42 +0100 Subject: [PATCH 2/6] WIP --- app/Home.kt | 1 + .../main/java/com/iqball/app/MainActivity.kt | 25 +++++++--- app/src/main/java/com/iqball/app/page/Home.kt | 46 +++++++++++++++++++ .../main/java/com/iqball/app/page/Settings.kt | 37 +++++++++++++++ gradle/libs.versions.toml | 2 +- 5 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 app/Home.kt create mode 100644 app/src/main/java/com/iqball/app/page/Home.kt create mode 100644 app/src/main/java/com/iqball/app/page/Settings.kt diff --git a/app/Home.kt b/app/Home.kt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/app/Home.kt @@ -0,0 +1 @@ + diff --git a/app/src/main/java/com/iqball/app/MainActivity.kt b/app/src/main/java/com/iqball/app/MainActivity.kt index 964daee..8410208 100644 --- a/app/src/main/java/com/iqball/app/MainActivity.kt +++ b/app/src/main/java/com/iqball/app/MainActivity.kt @@ -1,6 +1,7 @@ package com.iqball.app import android.os.Bundle +import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.fillMaxSize @@ -8,13 +9,17 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import arrow.core.Either import com.google.gson.Gson import com.google.gson.GsonBuilder import com.iqball.app.api.EitherBodyConverter import com.iqball.app.api.EitherCallAdapterFactory +import com.iqball.app.api.service.AuthService import com.iqball.app.api.service.IQBallService +import com.iqball.app.page.HomeMain import com.iqball.app.page.RegisterPage import com.iqball.app.ui.theme.IQBallTheme +import kotlinx.coroutines.runBlocking import okhttp3.OkHttpClient import okhttp3.ResponseBody import retrofit2.Converter @@ -26,14 +31,14 @@ import java.lang.reflect.Type class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - - val gson = Gson() + Log.d("test", "test") + /*val gson = Gson() val retrofit = Retrofit.Builder() .addConverterFactory(EitherBodyConverter.create()) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(EitherCallAdapterFactory.create(gson)) - .baseUrl("https://iqball.maxou.dev/api/dotnet-master/") + .baseUrl("http://maxou.dev/") .client( OkHttpClient.Builder() .addInterceptor { it.proceed(it.request()) } @@ -41,13 +46,14 @@ class MainActivity : ComponentActivity() { ) .build() - val service = retrofit.create() + val service = retrofit.create()*/ setContent { IQBallTheme { // A surface container using the 'background' color from the theme Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { - App(service) + //App(service) + HomeMain() } } } @@ -56,5 +62,12 @@ class MainActivity : ComponentActivity() { @Composable fun App(service: IQBallService) { - RegisterPage(service) + runBlocking { + val result = service.login(AuthService.LoginRequest("yanis@mail.com", "123456")) + + //val auth = result.getOrNull()!! + Log.d("test", "test") + //service.getUserData(auth.token) + } + //RegisterPage(service) } \ No newline at end of file diff --git a/app/src/main/java/com/iqball/app/page/Home.kt b/app/src/main/java/com/iqball/app/page/Home.kt new file mode 100644 index 0000000..d3d189d --- /dev/null +++ b/app/src/main/java/com/iqball/app/page/Home.kt @@ -0,0 +1,46 @@ +package com.iqball.app.page + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.border +import androidx.compose.runtime.Composable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CutCornerShape +import androidx.compose.material3.Text +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.iqball.app.R +import com.iqball.app.ui.theme.IQBallTheme + +@Composable +fun HomeMain() { + Column() { + Row ( + modifier = Modifier + .fillMaxWidth() + .height(100.dp) + .border( + border = BorderStroke(2.dp, Color.Blue), + shape = CutCornerShape(8.dp) + ) + ){ + Text( + "IQBALL", + modifier = Modifier.border( + border = BorderStroke(2.dp, Color.Red), + shape = CutCornerShape(8.dp) + ) + ) + } + } +} diff --git a/app/src/main/java/com/iqball/app/page/Settings.kt b/app/src/main/java/com/iqball/app/page/Settings.kt new file mode 100644 index 0000000..31223e7 --- /dev/null +++ b/app/src/main/java/com/iqball/app/page/Settings.kt @@ -0,0 +1,37 @@ +package com.iqball.app.page + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import com.iqball.app.ui.theme.IQBallTheme + +@Composable +fun SettingsMain() { + Column() { + + } +} + +@Composable +fun Greeting(name: String, modifier: Modifier = Modifier) { + Text( + text = "Hello $name!", + modifier = modifier + ) +} + +@Preview(showBackground = true) +@Composable +fun GreetingPreview() { + IQBallTheme { + Greeting("Android") + } +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9c53489..f10c49e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.3.0" +agp = "8.2.2" arrowCore = "1.2.1" converterGson = "2.9.0" kotlin = "1.9.0" -- 2.36.3 From 8eaa9e65cb2b2c9b45c17889a3b90e76dbf3cd71 Mon Sep 17 00:00:00 2001 From: d_yanis Date: Sat, 30 Mar 2024 11:57:30 +0100 Subject: [PATCH 3/6] refactoring --- app/build.gradle.kts | 2 +- app/src/main/AndroidManifest.xml | 2 + .../main/java/com/iqball/app/MainActivity.kt | 22 +- .../com/iqball/app/api/service/UserService.kt | 4 +- .../main/java/com/iqball/app/model/Tactic.kt | 9 + .../main/java/com/iqball/app/model/Team.kt | 29 ++ app/src/main/java/com/iqball/app/page/Home.kt | 46 -- .../main/java/com/iqball/app/page/HomePage.kt | 394 ++++++++++++++++++ .../main/java/com/iqball/app/page/Settings.kt | 37 -- .../java/com/iqball/app/ui/theme/Color.kt | 8 +- .../java/com/iqball/app/ui/theme/Theme.kt | 31 +- 11 files changed, 471 insertions(+), 113 deletions(-) create mode 100644 app/src/main/java/com/iqball/app/model/Tactic.kt create mode 100644 app/src/main/java/com/iqball/app/model/Team.kt delete mode 100644 app/src/main/java/com/iqball/app/page/Home.kt create mode 100644 app/src/main/java/com/iqball/app/page/HomePage.kt delete mode 100644 app/src/main/java/com/iqball/app/page/Settings.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0e3ab1c..e6ef194 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -56,7 +56,7 @@ android { } dependencies { - + implementation("io.coil-kt:coil-compose:2.6.0") implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bab787e..f090dc0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,8 @@ + + ()*/ + val service = retrofit.create() setContent { IQBallTheme { // A surface container using the 'background' color from the theme Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { //App(service) - HomeMain() + HomePage(service) } } } @@ -65,9 +59,9 @@ fun App(service: IQBallService) { runBlocking { val result = service.login(AuthService.LoginRequest("yanis@mail.com", "123456")) - //val auth = result.getOrNull()!! + val auth = result.getOrNull()!! Log.d("test", "test") - //service.getUserData(auth.token) + service.getUserData(auth.token) } - //RegisterPage(service) + RegisterPage(service) } \ No newline at end of file diff --git a/app/src/main/java/com/iqball/app/api/service/UserService.kt b/app/src/main/java/com/iqball/app/api/service/UserService.kt index f82376d..61a2179 100644 --- a/app/src/main/java/com/iqball/app/api/service/UserService.kt +++ b/app/src/main/java/com/iqball/app/api/service/UserService.kt @@ -1,10 +1,12 @@ package com.iqball.app.api.service +import com.iqball.app.model.Tactic +import com.iqball.app.model.Team import retrofit2.http.GET import retrofit2.http.Header interface UserService { - data class UserDataResponse(val teams: List, val tactics: List) + data class UserDataResponse(val teams: List, val tactics: List) @GET("user-data") suspend fun getUserData(@Header("Authorization") auth: String): APIResult diff --git a/app/src/main/java/com/iqball/app/model/Tactic.kt b/app/src/main/java/com/iqball/app/model/Tactic.kt new file mode 100644 index 0000000..1cf5067 --- /dev/null +++ b/app/src/main/java/com/iqball/app/model/Tactic.kt @@ -0,0 +1,9 @@ +package com.iqball.app.model + +data class Tactic ( + val id: Int, + val name: String, + val ownerId: Int, + val courtType: String, + val creationDate: Long +) \ No newline at end of file diff --git a/app/src/main/java/com/iqball/app/model/Team.kt b/app/src/main/java/com/iqball/app/model/Team.kt new file mode 100644 index 0000000..2a7b99e --- /dev/null +++ b/app/src/main/java/com/iqball/app/model/Team.kt @@ -0,0 +1,29 @@ +package com.iqball.app.model; + +class Team public constructor( + private val id: Int, + private val name: String, + private val picture: String, + private val mainColor: String, + private val secondColor: String +) { + public fun getId() : Int { + return id + } + + public fun getName() : String { + return name + } + + public fun getPicture() : String { + return picture + } + + public fun getMainColor() : String { + return mainColor + } + + public fun getSecondColor() : String { + return secondColor + } +} diff --git a/app/src/main/java/com/iqball/app/page/Home.kt b/app/src/main/java/com/iqball/app/page/Home.kt deleted file mode 100644 index d3d189d..0000000 --- a/app/src/main/java/com/iqball/app/page/Home.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.iqball.app.page - -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.Image -import androidx.compose.foundation.border -import androidx.compose.runtime.Composable -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.shape.CutCornerShape -import androidx.compose.material3.Text -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.iqball.app.R -import com.iqball.app.ui.theme.IQBallTheme - -@Composable -fun HomeMain() { - Column() { - Row ( - modifier = Modifier - .fillMaxWidth() - .height(100.dp) - .border( - border = BorderStroke(2.dp, Color.Blue), - shape = CutCornerShape(8.dp) - ) - ){ - Text( - "IQBALL", - modifier = Modifier.border( - border = BorderStroke(2.dp, Color.Red), - shape = CutCornerShape(8.dp) - ) - ) - } - } -} diff --git a/app/src/main/java/com/iqball/app/page/HomePage.kt b/app/src/main/java/com/iqball/app/page/HomePage.kt new file mode 100644 index 0000000..9d58a99 --- /dev/null +++ b/app/src/main/java/com/iqball/app/page/HomePage.kt @@ -0,0 +1,394 @@ +package com.iqball.app.page + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.runtime.Composable +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.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid +import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells +import androidx.compose.foundation.lazy.staggeredgrid.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.core.graphics.toColorInt +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.TopAppBarDefaults.pinnedScrollBehavior +import androidx.compose.material3.rememberTopAppBarState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.iqball.app.model.Tactic +import com.iqball.app.model.Team +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.TextUnit +import arrow.core.Either +import coil.compose.AsyncImage +import com.iqball.app.api.service.AuthService +import com.iqball.app.api.service.IQBallService +import com.iqball.app.api.service.UserService +import kotlinx.coroutines.runBlocking +import java.time.Instant +import java.time.LocalDateTime +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun HomePage(service: IQBallService) { + val tactics: List + val teams: List + var invalid = false + + val data = getDataFromApi(service) + if (data == null) { + tactics = listOf() + teams = listOf() + invalid = true + + } else { + tactics = data.tactics + teams = data.teams + } + + val scrollBehavior = pinnedScrollBehavior(rememberTopAppBarState()) + Scaffold( + modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), + topBar = { + CenterAlignedTopAppBar( + colors = TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.primary, + titleContentColor = MaterialTheme.colorScheme.secondary, + ), + title = { + Text( + "IQBall", + fontSize = 40.sp, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + }, + scrollBehavior = scrollBehavior + ) + }, + ) { innerPadding -> + Body(innerPadding, tactics, teams, invalid) + } +} + +@Composable +fun Body(padding: PaddingValues, tactics: List, teams: List, invalid: Boolean) { + Column( + modifier = Modifier + .padding(padding) + ) { + var isTactics by remember { mutableStateOf(true) } + TabButtons(isTactics) { newIsTactic -> + isTactics = newIsTactic + } + if (isTactics) { + ListTacticCard(tactics) + } else { + ListTeamCard(teams) + } + if (invalid) { + TextCentered(text = "Erreur : Aucune connexion internet. Veillez activer votre connexion internet puis relancer l'application", fontSize = 20.sp ) + } + } +} + +@Composable +fun TabButtons(isTactics: Boolean, onToggle: (Boolean) -> Unit) { + Row( + horizontalArrangement = Arrangement.Center, + modifier = Modifier + .padding(top = 10.dp, start = 2.dp, end = 2.dp) + .fillMaxWidth() + .padding(top = 10.dp, bottom = 10.dp) + + ) { + val tacticTitle = "Espace personnel" + val teamTitle = "Mes équipes" + val spaceButton = 5.dp + if (isTactics) { + FilledButton(tacticTitle) {} + Spacer( + modifier = Modifier + .padding(spaceButton) + ) + OutlinedButton(teamTitle) { + onToggle(false) + } + } else { + OutlinedButton(tacticTitle) { + onToggle(true) + } + Spacer( + modifier = Modifier + .padding(spaceButton) + ) + FilledButton(teamTitle) {} + } + } +} + +@Composable +fun ListTacticCard(tactics: List) { + LazyVerticalStaggeredGrid( + columns = StaggeredGridCells.Fixed(2), + modifier = Modifier + .padding(5.dp), + content = { + items(tactics) { tactic -> + TacticCard(tactic) + } + } + ) +} + +@Composable +fun ListTeamCard(teams: List) { + LazyVerticalStaggeredGrid( + columns = StaggeredGridCells.Fixed(2), + modifier = Modifier + .padding(5.dp), + content = { + items(teams) { team -> + TeamCard(team) + } + } + ) +} + +@Composable +fun TacticCard(tactic: Tactic) { + Column( + modifier = Modifier + .padding(5.dp) + .border( + border = BorderStroke(1.dp, Color(0xFFDADCE0)), + shape = RoundedCornerShape(8.dp) + ) + .shadow(1.dp, shape = RoundedCornerShape(8.dp)) + .background( + color = Color(0xFFFFFFFF) + ) + .padding(15.dp) + ) { + Row { + TextCentered(text = tactic.name, fontSize = 16.sp) + } + Row { + val date =LocalDateTime.ofInstant(Instant.ofEpochMilli(tactic.creationDate), ZoneId.systemDefault()) + val dateFormatted = date.format(DateTimeFormatter.ofPattern("dd/MM/yyyy kk:mm")) + TextCentered(text = dateFormatted , fontSize = 10.sp, fontWeight = FontWeight.Bold, modifier = Modifier.padding(2.dp)) + } + } +} + +@Composable +fun TeamCard(team: Team) { + var mainColor = Color.White + var secondColor = Color.White + var validMain = true + var validSecond = true + try { + mainColor = Color(team.getMainColor().toColorInt()) + } catch (e : Exception) { + validMain = false + } + try { + secondColor = Color(team.getSecondColor().toColorInt()) + } catch (e : Exception) { + validSecond = false + } + + Column( + modifier = Modifier + .padding(5.dp) + .border( + border = BorderStroke(1.dp, Color(0xFFDADCE0)), + shape = RoundedCornerShape(8.dp) + ) + .shadow(1.dp, shape = RoundedCornerShape(8.dp)) + .background( + color = Color(0xFFFFFFFF) + ) + .padding(15.dp) + + ) { + AsyncImage( + model = team.getPicture(), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .border( + border = BorderStroke(1.dp, Color(0xFFDADCE0)), + shape = RectangleShape + ) + ) + TextCentered(text = team.getName()) + Row { + TeamColorCard("Couleur principale", mainColor, 0.5f) + TeamColorCard("Couleur secondaire", secondColor) + } + if(!validMain || !validSecond) { + TextCentered(text = "Erreur : Format des couleurs invalides", fontSize = 16.sp) + } + } +} + +@Composable +fun TeamColorCard(text: String, color: Color, fraction : Float = 1f) { + Column( + modifier = Modifier + .fillMaxWidth(fraction) + ) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .fillMaxWidth() + .padding(2.dp) + + ) { + Canvas( + modifier = Modifier.size(30.dp), + onDraw = { + drawCircle(color = color) + } + ) + } + TextCentered(text = text, fontSize = 6.sp) + } +} + +@Composable +fun FilledButton(text: String, onClick: () -> Unit) { + Button( + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.tertiary, + ), + onClick = { onClick() } + ) { + Text(text) + } +} + +@Composable +fun OutlinedButton(text: String, onClick: () -> Unit) { + OutlinedButton( + border = BorderStroke( + 1.dp, + color = MaterialTheme.colorScheme.tertiary + ), + colors = ButtonDefaults.outlinedButtonColors( + contentColor = MaterialTheme.colorScheme.tertiary + ), + onClick = { onClick() }) { + Text(text) + } +} + +@Composable +fun TextCentered( modifier: Modifier = Modifier, text: String, fontSize: TextUnit = 18.sp, fontWeight: FontWeight? = null) { + Text(text = text, + modifier = modifier + .fillMaxWidth(), + textAlign = TextAlign.Center, + fontSize = fontSize, + fontWeight = fontWeight + ) +} + + fun getDataFromApi(service: IQBallService) : UserService.UserDataResponse?{ + var res : UserService.UserDataResponse? = null + try { + runBlocking { + val result = service.login(AuthService.LoginRequest("yanis@mail.com", "123456")) + when (result) { + is Either.Left -> null + is Either.Right -> { + val data = service.getUserData(result.value.token) + when (data) { + is Either.Left -> null + is Either.Right -> { + res = data.value + } + } + } + } + } + return res + } catch (error : Exception) { + return res + } +} + +fun getStubTeam() : ArrayList { + val teams = ArrayList() + teams.addAll( + listOf( + Team(1, "equipe1", "https://www.shutterstock.com/image-vector/batman-logo-icon-vector-template-600nw-1998917738.jpg", "#4500FF", "#456789"), + Team(2, "equipe2", "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/2f899b52-daf8-4098-83fe-5c5e27b69915/d4s4nzj-5f915488-7462-4908-b3c5-1605b0e4dc32.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7InBhdGgiOiJcL2ZcLzJmODk5YjUyLWRhZjgtNDA5OC04M2ZlLTVjNWUyN2I2OTkxNVwvZDRzNG56ai01ZjkxNTQ4OC03NDYyLTQ5MDgtYjNjNS0xNjA1YjBlNGRjMzIuanBnIn1dXSwiYXVkIjpbInVybjpzZXJ2aWNlOmZpbGUuZG93bmxvYWQiXX0.KqdQgobH9kzyMIeYIneNdyWgKTpGbztwSKqK5pO3YYs", "121212", "#564738"), + Team(3, "equipe3", "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ1jiizrhhGsr48WrxxBbDpkFrRKeAYlGgcNQ&usqp=CAU", "#987654", "121212"), + Team(4, "equipe4", "https://www.shutterstock.com/image-vector/batman-logo-icon-vector-template-600nw-1998917738.jpg", "121212", "121212") + ) + ) + return teams +} + +fun getStubTactic() : ArrayList { + val tactics = ArrayList() + tactics.addAll( + listOf( + Tactic(1, "Test", 1, "testType", 1), + Tactic(2, "Test2", 1, "testType", 1), + Tactic(3, "Test3", 4, "test23Type", 1), + Tactic(3, "Test6", 4, "test23Type", 1), + Tactic(1, "Test", 1, "testType", 1), + Tactic(2, "Test2", 1, "testType", 1), + Tactic(3, "Test3", 4, "test23Type", 1), + Tactic(3, "Test6", 4, "test23Type", 1), + Tactic(1, "Test", 1, "testType", 1), + Tactic(2, "Test2", 1, "testType", 1), + Tactic(3, "Test3", 4, "test23Type", 1), + Tactic(3, "Test6", 4, "test23Type", 1), + Tactic(1, "Test", 1, "testType", 1), + Tactic(2, "Test2", 1, "testType", 1), + Tactic(3, "Test3", 4, "test23Type", 1), + Tactic(3, "Test6", 4, "test23Type", 1), + Tactic(1, "Test", 1, "testType", 1), + Tactic(2, "Test2", 1, "testType", 1), + Tactic(3, "Test3", 4, "test23Type", 1), + Tactic(3, "Test6", 4, "test23Type", 1) + ) + ) + + return tactics +} \ No newline at end of file diff --git a/app/src/main/java/com/iqball/app/page/Settings.kt b/app/src/main/java/com/iqball/app/page/Settings.kt deleted file mode 100644 index 31223e7..0000000 --- a/app/src/main/java/com/iqball/app/page/Settings.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.iqball.app.page - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import com.iqball.app.ui.theme.IQBallTheme - -@Composable -fun SettingsMain() { - Column() { - - } -} - -@Composable -fun Greeting(name: String, modifier: Modifier = Modifier) { - Text( - text = "Hello $name!", - modifier = modifier - ) -} - -@Preview(showBackground = true) -@Composable -fun GreetingPreview() { - IQBallTheme { - Greeting("Android") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/iqball/app/ui/theme/Color.kt b/app/src/main/java/com/iqball/app/ui/theme/Color.kt index 6b01d6c..316219b 100644 --- a/app/src/main/java/com/iqball/app/ui/theme/Color.kt +++ b/app/src/main/java/com/iqball/app/ui/theme/Color.kt @@ -8,4 +8,10 @@ val Pink80 = Color(0xFFEFB8C8) val Purple40 = Color(0xFF6650a4) val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) \ No newline at end of file +val Pink40 = Color(0xFF7D5260) + +val black = Color(0xFF191A21) +val orange = Color(0xFFFFA239) +val blue = Color(0xFF0D6EFD) +val grey = Color(0xFF282A36) +val back = Color(0xFFf8f8f8) \ No newline at end of file diff --git a/app/src/main/java/com/iqball/app/ui/theme/Theme.kt b/app/src/main/java/com/iqball/app/ui/theme/Theme.kt index b521bd2..7f0d92c 100644 --- a/app/src/main/java/com/iqball/app/ui/theme/Theme.kt +++ b/app/src/main/java/com/iqball/app/ui/theme/Theme.kt @@ -18,23 +18,28 @@ import androidx.core.view.WindowCompat private val DarkColorScheme = darkColorScheme( primary = Purple80, secondary = PurpleGrey80, - tertiary = Pink80 + tertiary = Pink80, + primaryContainer = black ) private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40 + primary = black, + secondary = orange, + tertiary = blue, + primaryContainer = black, + surface = grey, + background = back - /* Other default colors to override - background = Color(0xFFFFFBFE), - surface = Color(0xFFFFFBFE), - onPrimary = Color.White, - onSecondary = Color.White, - onTertiary = Color.White, - onBackground = Color(0xFF1C1B1F), - onSurface = Color(0xFF1C1B1F), - */ + + /* Other default colors to override +background = Color(0xFFFFFBFE), +surface = Color(0xFFFFFBFE), +onPrimary = Color.White, +onSecondary = Color.White, +onTertiary = Color.White, +onBackground = Color(0xFF1C1B1F), +onSurface = Color(0xFF1C1B1F), +*/ ) @Composable -- 2.36.3 From 30f8066a14728cf0e55d9ec672bb2e3d5d7df743 Mon Sep 17 00:00:00 2001 From: d_yanis Date: Tue, 2 Apr 2024 16:47:24 +0200 Subject: [PATCH 4/6] Applying Review --- .../main/java/com/iqball/app/MainActivity.kt | 20 +- .../main/java/com/iqball/app/model/Team.kt | 34 +- .../main/java/com/iqball/app/page/HomePage.kt | 300 +++++++++++------- .../java/com/iqball/app/ui/theme/Color.kt | 2 + .../java/com/iqball/app/ui/theme/Theme.kt | 3 +- app/src/main/res/values/colors.xml | 1 + 6 files changed, 206 insertions(+), 154 deletions(-) diff --git a/app/src/main/java/com/iqball/app/MainActivity.kt b/app/src/main/java/com/iqball/app/MainActivity.kt index 596da9f..79c9e33 100644 --- a/app/src/main/java/com/iqball/app/MainActivity.kt +++ b/app/src/main/java/com/iqball/app/MainActivity.kt @@ -43,25 +43,15 @@ class MainActivity : ComponentActivity() { val service = retrofit.create() setContent { - IQBallTheme { + IQBallTheme(darkTheme = false, dynamicColor = false) { // A surface container using the 'background' color from the theme - Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { - //App(service) + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { HomePage(service) } } } } -} - -@Composable -fun App(service: IQBallService) { - runBlocking { - val result = service.login(AuthService.LoginRequest("yanis@mail.com", "123456")) - - val auth = result.getOrNull()!! - Log.d("test", "test") - service.getUserData(auth.token) - } - RegisterPage(service) } \ No newline at end of file diff --git a/app/src/main/java/com/iqball/app/model/Team.kt b/app/src/main/java/com/iqball/app/model/Team.kt index 2a7b99e..8a91a8e 100644 --- a/app/src/main/java/com/iqball/app/model/Team.kt +++ b/app/src/main/java/com/iqball/app/model/Team.kt @@ -1,29 +1,9 @@ package com.iqball.app.model; -class Team public constructor( - private val id: Int, - private val name: String, - private val picture: String, - private val mainColor: String, - private val secondColor: String -) { - public fun getId() : Int { - return id - } - - public fun getName() : String { - return name - } - - public fun getPicture() : String { - return picture - } - - public fun getMainColor() : String { - return mainColor - } - - public fun getSecondColor() : String { - return secondColor - } -} +data class Team ( + val id: Int, + val name: String, + val picture: String, + val mainColor: String, + val secondColor: String +) \ No newline at end of file diff --git a/app/src/main/java/com/iqball/app/page/HomePage.kt b/app/src/main/java/com/iqball/app/page/HomePage.kt index 9d58a99..8d404e2 100644 --- a/app/src/main/java/com/iqball/app/page/HomePage.kt +++ b/app/src/main/java/com/iqball/app/page/HomePage.kt @@ -24,13 +24,13 @@ import androidx.core.graphics.toColorInt import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults.pinnedScrollBehavior import androidx.compose.material3.rememberTopAppBarState -import androidx.compose.runtime.getValue +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -40,7 +40,6 @@ import androidx.compose.ui.unit.sp import com.iqball.app.model.Tactic import com.iqball.app.model.Team import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.RectangleShape @@ -85,7 +84,7 @@ fun HomePage(service: IQBallService) { colors = TopAppBarDefaults.topAppBarColors( containerColor = MaterialTheme.colorScheme.primary, titleContentColor = MaterialTheme.colorScheme.secondary, - ), + ), title = { Text( "IQBall", @@ -103,101 +102,107 @@ fun HomePage(service: IQBallService) { } @Composable -fun Body(padding: PaddingValues, tactics: List, teams: List, invalid: Boolean) { +private fun Body(padding: PaddingValues, tactics: List, teams: List, invalid: Boolean) { Column( modifier = Modifier .padding(padding) ) { - var isTactics by remember { mutableStateOf(true) } - TabButtons(isTactics) { newIsTactic -> - isTactics = newIsTactic - } - if (isTactics) { - ListTacticCard(tactics) - } else { - ListTeamCard(teams) - } - if (invalid) { - TextCentered(text = "Erreur : Aucune connexion internet. Veillez activer votre connexion internet puis relancer l'application", fontSize = 20.sp ) + val selectedTab = remember { mutableIntStateOf(0) } + val tabs = listOf Unit>>( + Pair("Espace personnel") { + ListComponentCard(tactics) { tactic -> + TacticCard(tactic = tactic) + } + }, + Pair("Mes Equipes") { + ListComponentCard(teams) { team -> + TeamCard(team = team) + } + } + ) + TabsSelector(tabsTitles = tabs.map { it.first }, selectedIndex = selectedTab) + if (!invalid) { + tabs[selectedTab.intValue].second() + return } } + + TextCentered( + text = "Erreur : Aucune connexion internet. Veillez activer votre connexion internet puis relancer l'application", + fontSize = 20.sp + ) } @Composable -fun TabButtons(isTactics: Boolean, onToggle: (Boolean) -> Unit) { +private fun TabsSelector(tabsTitles: List, selectedIndex: MutableState) { Row( horizontalArrangement = Arrangement.Center, modifier = Modifier - .padding(top = 10.dp, start = 2.dp, end = 2.dp) + .padding(top = 20.dp, start = 2.dp, end = 2.dp, bottom = 10.dp) .fillMaxWidth() - .padding(top = 10.dp, bottom = 10.dp) - ) { - val tacticTitle = "Espace personnel" - val teamTitle = "Mes équipes" - val spaceButton = 5.dp - if (isTactics) { - FilledButton(tacticTitle) {} - Spacer( - modifier = Modifier - .padding(spaceButton) + + for ((idx, tab) in tabsTitles.withIndex()) { + TabButton( + tab, + fill = idx == selectedIndex.value, + onClick = { selectedIndex.value = idx } ) - OutlinedButton(teamTitle) { - onToggle(false) - } - } else { - OutlinedButton(tacticTitle) { - onToggle(true) + if (idx != tabsTitles.size - 1) { + Spacer( + modifier = Modifier + .padding(5.dp) + ) } - Spacer( - modifier = Modifier - .padding(spaceButton) - ) - FilledButton(teamTitle) {} } + } } @Composable -fun ListTacticCard(tactics: List) { - LazyVerticalStaggeredGrid( - columns = StaggeredGridCells.Fixed(2), - modifier = Modifier - .padding(5.dp), - content = { - items(tactics) { tactic -> - TacticCard(tactic) - } - } - ) +private fun TabButton(title: String, fill: Boolean, onClick: () -> Unit) { + val scheme = MaterialTheme.colorScheme + Button( + border = BorderStroke( + 1.dp, + color = scheme.tertiary + ), + colors = ButtonDefaults.buttonColors( + containerColor = if (fill) scheme.tertiary else scheme.background, + contentColor = if (fill) scheme.background else scheme.tertiary, + ), + onClick = onClick + ) { + Text(title) + } } @Composable -fun ListTeamCard(teams: List) { +private fun ListComponentCard(items: List, componentCard: @Composable (C) -> Unit) { LazyVerticalStaggeredGrid( columns = StaggeredGridCells.Fixed(2), modifier = Modifier .padding(5.dp), content = { - items(teams) { team -> - TeamCard(team) + items(items) { tactic -> + componentCard(tactic) } } ) } @Composable -fun TacticCard(tactic: Tactic) { +private fun TacticCard(tactic: Tactic) { Column( modifier = Modifier .padding(5.dp) .border( - border = BorderStroke(1.dp, Color(0xFFDADCE0)), + border = BorderStroke(1.dp, MaterialTheme.colorScheme.outline), shape = RoundedCornerShape(8.dp) ) .shadow(1.dp, shape = RoundedCornerShape(8.dp)) .background( - color = Color(0xFFFFFFFF) + color = Color.White ) .padding(15.dp) ) { @@ -205,27 +210,35 @@ fun TacticCard(tactic: Tactic) { TextCentered(text = tactic.name, fontSize = 16.sp) } Row { - val date =LocalDateTime.ofInstant(Instant.ofEpochMilli(tactic.creationDate), ZoneId.systemDefault()) + val date = LocalDateTime.ofInstant( + Instant.ofEpochMilli(tactic.creationDate), + ZoneId.systemDefault() + ) val dateFormatted = date.format(DateTimeFormatter.ofPattern("dd/MM/yyyy kk:mm")) - TextCentered(text = dateFormatted , fontSize = 10.sp, fontWeight = FontWeight.Bold, modifier = Modifier.padding(2.dp)) + TextCentered( + text = dateFormatted, + fontSize = 10.sp, + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(2.dp) + ) } } } @Composable -fun TeamCard(team: Team) { +private fun TeamCard(team: Team) { var mainColor = Color.White var secondColor = Color.White var validMain = true var validSecond = true try { - mainColor = Color(team.getMainColor().toColorInt()) - } catch (e : Exception) { + mainColor = Color(team.mainColor.toColorInt()) + } catch (e: Exception) { validMain = false } try { - secondColor = Color(team.getSecondColor().toColorInt()) - } catch (e : Exception) { + secondColor = Color(team.secondColor.toColorInt()) + } catch (e: Exception) { validSecond = false } @@ -233,39 +246,39 @@ fun TeamCard(team: Team) { modifier = Modifier .padding(5.dp) .border( - border = BorderStroke(1.dp, Color(0xFFDADCE0)), + border = BorderStroke(1.dp, MaterialTheme.colorScheme.outline), shape = RoundedCornerShape(8.dp) ) .shadow(1.dp, shape = RoundedCornerShape(8.dp)) .background( - color = Color(0xFFFFFFFF) + color = Color.White ) .padding(15.dp) ) { AsyncImage( - model = team.getPicture(), + model = team.picture, contentDescription = null, modifier = Modifier .fillMaxWidth() .border( - border = BorderStroke(1.dp, Color(0xFFDADCE0)), + border = BorderStroke(1.dp, MaterialTheme.colorScheme.outline), shape = RectangleShape ) ) - TextCentered(text = team.getName()) + TextCentered(text = team.name) Row { - TeamColorCard("Couleur principale", mainColor, 0.5f) - TeamColorCard("Couleur secondaire", secondColor) + TeamColorCard("Couleur principale", mainColor, 0.5f) + TeamColorCard("Couleur secondaire", secondColor) } - if(!validMain || !validSecond) { + if (!validMain || !validSecond) { TextCentered(text = "Erreur : Format des couleurs invalides", fontSize = 16.sp) } } } @Composable -fun TeamColorCard(text: String, color: Color, fraction : Float = 1f) { +private fun TeamColorCard(text: String, color: Color, fraction: Float = 1f) { Column( modifier = Modifier .fillMaxWidth(fraction) @@ -289,35 +302,14 @@ fun TeamColorCard(text: String, color: Color, fraction : Float = 1f) { } @Composable -fun FilledButton(text: String, onClick: () -> Unit) { - Button( - colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.tertiary, - ), - onClick = { onClick() } - ) { - Text(text) - } -} - -@Composable -fun OutlinedButton(text: String, onClick: () -> Unit) { - OutlinedButton( - border = BorderStroke( - 1.dp, - color = MaterialTheme.colorScheme.tertiary - ), - colors = ButtonDefaults.outlinedButtonColors( - contentColor = MaterialTheme.colorScheme.tertiary - ), - onClick = { onClick() }) { - Text(text) - } -} - -@Composable -fun TextCentered( modifier: Modifier = Modifier, text: String, fontSize: TextUnit = 18.sp, fontWeight: FontWeight? = null) { - Text(text = text, +private fun TextCentered( + modifier: Modifier = Modifier, + text: String, + fontSize: TextUnit = 18.sp, + fontWeight: FontWeight? = null +) { + Text( + text = text, modifier = modifier .fillMaxWidth(), textAlign = TextAlign.Center, @@ -326,8 +318,8 @@ fun TextCentered( modifier: Modifier = Modifier, text: String, fontSize: TextUni ) } - fun getDataFromApi(service: IQBallService) : UserService.UserDataResponse?{ - var res : UserService.UserDataResponse? = null +private fun getDataFromApi(service: IQBallService): UserService.UserDataResponse? { + var res: UserService.UserDataResponse? = null try { runBlocking { val result = service.login(AuthService.LoginRequest("yanis@mail.com", "123456")) @@ -345,25 +337,49 @@ fun TextCentered( modifier: Modifier = Modifier, text: String, fontSize: TextUni } } return res - } catch (error : Exception) { + } catch (error: Exception) { return res } } -fun getStubTeam() : ArrayList { +private fun getStubTeam(): ArrayList { val teams = ArrayList() teams.addAll( listOf( - Team(1, "equipe1", "https://www.shutterstock.com/image-vector/batman-logo-icon-vector-template-600nw-1998917738.jpg", "#4500FF", "#456789"), - Team(2, "equipe2", "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/2f899b52-daf8-4098-83fe-5c5e27b69915/d4s4nzj-5f915488-7462-4908-b3c5-1605b0e4dc32.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7InBhdGgiOiJcL2ZcLzJmODk5YjUyLWRhZjgtNDA5OC04M2ZlLTVjNWUyN2I2OTkxNVwvZDRzNG56ai01ZjkxNTQ4OC03NDYyLTQ5MDgtYjNjNS0xNjA1YjBlNGRjMzIuanBnIn1dXSwiYXVkIjpbInVybjpzZXJ2aWNlOmZpbGUuZG93bmxvYWQiXX0.KqdQgobH9kzyMIeYIneNdyWgKTpGbztwSKqK5pO3YYs", "121212", "#564738"), - Team(3, "equipe3", "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ1jiizrhhGsr48WrxxBbDpkFrRKeAYlGgcNQ&usqp=CAU", "#987654", "121212"), - Team(4, "equipe4", "https://www.shutterstock.com/image-vector/batman-logo-icon-vector-template-600nw-1998917738.jpg", "121212", "121212") + Team( + 1, + "equipe1", + "https://www.shutterstock.com/image-vector/batman-logo-icon-vector-template-600nw-1998917738.jpg", + "#4500FF", + "#456789" + ), + Team( + 2, + "equipe2", + "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/2f899b52-daf8-4098-83fe-5c5e27b69915/d4s4nzj-5f915488-7462-4908-b3c5-1605b0e4dc32.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7InBhdGgiOiJcL2ZcLzJmODk5YjUyLWRhZjgtNDA5OC04M2ZlLTVjNWUyN2I2OTkxNVwvZDRzNG56ai01ZjkxNTQ4OC03NDYyLTQ5MDgtYjNjNS0xNjA1YjBlNGRjMzIuanBnIn1dXSwiYXVkIjpbInVybjpzZXJ2aWNlOmZpbGUuZG93bmxvYWQiXX0.KqdQgobH9kzyMIeYIneNdyWgKTpGbztwSKqK5pO3YYs", + "121212", + "#564738" + ), + Team( + 3, + "equipe3", + "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ1jiizrhhGsr48WrxxBbDpkFrRKeAYlGgcNQ&usqp=CAU", + "#987654", + "121212" + ), + Team( + 4, + "equipe4", + "https://www.shutterstock.com/image-vector/batman-logo-icon-vector-template-600nw-1998917738.jpg", + "121212", + "121212" + ) ) ) return teams } -fun getStubTactic() : ArrayList { +private fun getStubTactic(): ArrayList { val tactics = ArrayList() tactics.addAll( listOf( @@ -391,4 +407,66 @@ fun getStubTactic() : ArrayList { ) return tactics -} \ No newline at end of file +} + +/* +======================================================= + Commentaire +======================================================= + + Gérer les listes à afficher avec des paires n'est pas forcément la meilleure chose à faire dans le contexte de composable. + Nous avons fait le choix de rester sur ce modèle par manque de temps. + +Nous aurions aussi pu faire quelque chose comme ça : + +@Composable +fun Body(padding: PaddingValues, tactics: List, teams: List, invalid: Boolean) { + Column(...) { + val selectedTab by remember { mutableIntStateOf(0) } + val tabs = remember(selectedTab) { + mutableStateOf(TabsGroup.entries.getOrNull(selectedTab)) + } + TabsSelector(tabsTitles = TabsGroup.entries.map { it.title }, selectedIndex = selectedTab, ) + if (!invalid) { + ListComponentCard { + when(selectedTab) { + TabsGroup.TEAM -> { + items(tactics) { + TacticCard(tactic = it) + } + } + TabsGroup.TACTIC -> ... + } + } + tabs[selectedTab.intValue].second() + return + } + + TextCentered(...) + } +} + +enum class TabsGroup { + TEAM, + TACTIC +} + +val TabsGroup.title: String + @Composable + get() = when(this) { + TabsGroup.TACTIC -> "Espace personnel" + TabsGroup.TEAM -> "Mes équipes" + } + +@Composable +fun ListComponentCard(componentCard: LazyStaggeredGridScope.() -> Unit) { + LazyVerticalStaggeredGrid( + columns = StaggeredGridCells.Fixed(2), + modifier = ..., + content = { + componentCard() + } + ) +} + + */ \ No newline at end of file diff --git a/app/src/main/java/com/iqball/app/ui/theme/Color.kt b/app/src/main/java/com/iqball/app/ui/theme/Color.kt index e8374f6..66341eb 100644 --- a/app/src/main/java/com/iqball/app/ui/theme/Color.kt +++ b/app/src/main/java/com/iqball/app/ui/theme/Color.kt @@ -15,4 +15,6 @@ val orange = Color(0xFFFFA239) val blue = Color(0xFF0D6EFD) val grey = Color(0xFF282A36) val back = Color(0xFFf8f8f8) +val borderCard = Color(0xFFDADCE0) + diff --git a/app/src/main/java/com/iqball/app/ui/theme/Theme.kt b/app/src/main/java/com/iqball/app/ui/theme/Theme.kt index 7f0d92c..ae5f228 100644 --- a/app/src/main/java/com/iqball/app/ui/theme/Theme.kt +++ b/app/src/main/java/com/iqball/app/ui/theme/Theme.kt @@ -28,7 +28,8 @@ private val LightColorScheme = lightColorScheme( tertiary = blue, primaryContainer = black, surface = grey, - background = back + background = back, + outline = borderCard /* Other default colors to override diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127..9255bbb 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -7,4 +7,5 @@ #FF018786 #FF000000 #FFFFFFFF + #FFDADCE0 \ No newline at end of file -- 2.36.3 From 71529f4b7ee5427b4053883ff8832d03db42b66c Mon Sep 17 00:00:00 2001 From: d_yanis Date: Tue, 2 Apr 2024 17:09:50 +0200 Subject: [PATCH 5/6] To english --- app/src/main/java/com/iqball/app/page/HomePage.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/iqball/app/page/HomePage.kt b/app/src/main/java/com/iqball/app/page/HomePage.kt index 8d404e2..ef5afed 100644 --- a/app/src/main/java/com/iqball/app/page/HomePage.kt +++ b/app/src/main/java/com/iqball/app/page/HomePage.kt @@ -411,13 +411,13 @@ private fun getStubTactic(): ArrayList { /* ======================================================= - Commentaire + Comment ======================================================= - Gérer les listes à afficher avec des paires n'est pas forcément la meilleure chose à faire dans le contexte de composable. - Nous avons fait le choix de rester sur ce modèle par manque de temps. +Managing lists to display with pairs might not be the best thing to do in the context of composable. +We chose to stick with this model due to a lack of time. -Nous aurions aussi pu faire quelque chose comme ça : +We could have also done something like this: @Composable fun Body(padding: PaddingValues, tactics: List, teams: List, invalid: Boolean) { -- 2.36.3 From b1a401ad224349654e8195f1e67202d7def15925 Mon Sep 17 00:00:00 2001 From: d_yanis Date: Tue, 2 Apr 2024 17:11:51 +0200 Subject: [PATCH 6/6] stub in files --- .../main/java/com/iqball/app/page/HomePage.kt | 67 ----------------- app/src/main/java/com/iqball/app/stub/Stub.kt | 72 +++++++++++++++++++ 2 files changed, 72 insertions(+), 67 deletions(-) create mode 100644 app/src/main/java/com/iqball/app/stub/Stub.kt diff --git a/app/src/main/java/com/iqball/app/page/HomePage.kt b/app/src/main/java/com/iqball/app/page/HomePage.kt index ef5afed..dc3129c 100644 --- a/app/src/main/java/com/iqball/app/page/HomePage.kt +++ b/app/src/main/java/com/iqball/app/page/HomePage.kt @@ -342,73 +342,6 @@ private fun getDataFromApi(service: IQBallService): UserService.UserDataResponse } } -private fun getStubTeam(): ArrayList { - val teams = ArrayList() - teams.addAll( - listOf( - Team( - 1, - "equipe1", - "https://www.shutterstock.com/image-vector/batman-logo-icon-vector-template-600nw-1998917738.jpg", - "#4500FF", - "#456789" - ), - Team( - 2, - "equipe2", - "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/2f899b52-daf8-4098-83fe-5c5e27b69915/d4s4nzj-5f915488-7462-4908-b3c5-1605b0e4dc32.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7InBhdGgiOiJcL2ZcLzJmODk5YjUyLWRhZjgtNDA5OC04M2ZlLTVjNWUyN2I2OTkxNVwvZDRzNG56ai01ZjkxNTQ4OC03NDYyLTQ5MDgtYjNjNS0xNjA1YjBlNGRjMzIuanBnIn1dXSwiYXVkIjpbInVybjpzZXJ2aWNlOmZpbGUuZG93bmxvYWQiXX0.KqdQgobH9kzyMIeYIneNdyWgKTpGbztwSKqK5pO3YYs", - "121212", - "#564738" - ), - Team( - 3, - "equipe3", - "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ1jiizrhhGsr48WrxxBbDpkFrRKeAYlGgcNQ&usqp=CAU", - "#987654", - "121212" - ), - Team( - 4, - "equipe4", - "https://www.shutterstock.com/image-vector/batman-logo-icon-vector-template-600nw-1998917738.jpg", - "121212", - "121212" - ) - ) - ) - return teams -} - -private fun getStubTactic(): ArrayList { - val tactics = ArrayList() - tactics.addAll( - listOf( - Tactic(1, "Test", 1, "testType", 1), - Tactic(2, "Test2", 1, "testType", 1), - Tactic(3, "Test3", 4, "test23Type", 1), - Tactic(3, "Test6", 4, "test23Type", 1), - Tactic(1, "Test", 1, "testType", 1), - Tactic(2, "Test2", 1, "testType", 1), - Tactic(3, "Test3", 4, "test23Type", 1), - Tactic(3, "Test6", 4, "test23Type", 1), - Tactic(1, "Test", 1, "testType", 1), - Tactic(2, "Test2", 1, "testType", 1), - Tactic(3, "Test3", 4, "test23Type", 1), - Tactic(3, "Test6", 4, "test23Type", 1), - Tactic(1, "Test", 1, "testType", 1), - Tactic(2, "Test2", 1, "testType", 1), - Tactic(3, "Test3", 4, "test23Type", 1), - Tactic(3, "Test6", 4, "test23Type", 1), - Tactic(1, "Test", 1, "testType", 1), - Tactic(2, "Test2", 1, "testType", 1), - Tactic(3, "Test3", 4, "test23Type", 1), - Tactic(3, "Test6", 4, "test23Type", 1) - ) - ) - - return tactics -} - /* ======================================================= Comment diff --git a/app/src/main/java/com/iqball/app/stub/Stub.kt b/app/src/main/java/com/iqball/app/stub/Stub.kt new file mode 100644 index 0000000..ba1a885 --- /dev/null +++ b/app/src/main/java/com/iqball/app/stub/Stub.kt @@ -0,0 +1,72 @@ +package com.iqball.app.stub + +import com.iqball.app.model.Tactic +import com.iqball.app.model.Team + + +private fun getStubTeam(): ArrayList { + val teams = ArrayList() + teams.addAll( + listOf( + Team( + 1, + "equipe1", + "https://www.shutterstock.com/image-vector/batman-logo-icon-vector-template-600nw-1998917738.jpg", + "#4500FF", + "#456789" + ), + Team( + 2, + "equipe2", + "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/2f899b52-daf8-4098-83fe-5c5e27b69915/d4s4nzj-5f915488-7462-4908-b3c5-1605b0e4dc32.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7InBhdGgiOiJcL2ZcLzJmODk5YjUyLWRhZjgtNDA5OC04M2ZlLTVjNWUyN2I2OTkxNVwvZDRzNG56ai01ZjkxNTQ4OC03NDYyLTQ5MDgtYjNjNS0xNjA1YjBlNGRjMzIuanBnIn1dXSwiYXVkIjpbInVybjpzZXJ2aWNlOmZpbGUuZG93bmxvYWQiXX0.KqdQgobH9kzyMIeYIneNdyWgKTpGbztwSKqK5pO3YYs", + "121212", + "#564738" + ), + Team( + 3, + "equipe3", + "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ1jiizrhhGsr48WrxxBbDpkFrRKeAYlGgcNQ&usqp=CAU", + "#987654", + "121212" + ), + Team( + 4, + "equipe4", + "https://www.shutterstock.com/image-vector/batman-logo-icon-vector-template-600nw-1998917738.jpg", + "121212", + "121212" + ) + ) + ) + return teams +} + +private fun getStubTactic(): ArrayList { + val tactics = ArrayList() + tactics.addAll( + listOf( + Tactic(1, "Test", 1, "testType", 1), + Tactic(2, "Test2", 1, "testType", 1), + Tactic(3, "Test3", 4, "test23Type", 1), + Tactic(3, "Test6", 4, "test23Type", 1), + Tactic(1, "Test", 1, "testType", 1), + Tactic(2, "Test2", 1, "testType", 1), + Tactic(3, "Test3", 4, "test23Type", 1), + Tactic(3, "Test6", 4, "test23Type", 1), + Tactic(1, "Test", 1, "testType", 1), + Tactic(2, "Test2", 1, "testType", 1), + Tactic(3, "Test3", 4, "test23Type", 1), + Tactic(3, "Test6", 4, "test23Type", 1), + Tactic(1, "Test", 1, "testType", 1), + Tactic(2, "Test2", 1, "testType", 1), + Tactic(3, "Test3", 4, "test23Type", 1), + Tactic(3, "Test6", 4, "test23Type", 1), + Tactic(1, "Test", 1, "testType", 1), + Tactic(2, "Test2", 1, "testType", 1), + Tactic(3, "Test3", 4, "test23Type", 1), + Tactic(3, "Test6", 4, "test23Type", 1) + ) + ) + + return tactics +} -- 2.36.3