From a8cffafe1677c2b00cb62cdbfc1f6bb65c2164cd Mon Sep 17 00:00:00 2001 From: "patrick.brugiere" Date: Fri, 29 Mar 2024 15:26:45 +0100 Subject: [PATCH 1/4] ajout de la bottomNavBar ( encore du travail dessus) --- Project/android/app/build.gradle.kts | 2 +- .../sae/android/sae_2a/view/HomeScreen.kt | 78 ++++++++++++------- .../java/sae/android/sae_2a/view/Screen.kt | 16 ++++ .../app/src/main/res/values/strings.xml | 2 + 4 files changed, 71 insertions(+), 27 deletions(-) create mode 100644 Project/android/app/src/main/java/sae/android/sae_2a/view/Screen.kt diff --git a/Project/android/app/build.gradle.kts b/Project/android/app/build.gradle.kts index 1472c13..2b70e88 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.11" + kotlinCompilerExtensionVersion = "1.5.1" } packaging { resources { 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 7f8b476..3ac4b34 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 @@ -12,11 +12,15 @@ 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.material.icons.Icons +import androidx.compose.material.icons.filled.Favorite import androidx.compose.material3.Button +import androidx.compose.material3.Icon import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -26,42 +30,64 @@ 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 androidx.navigation.NavDestination.Companion.hierarchy +import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable +import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import sae.android.sae_2a.R import sae.android.sae_2a.game.VocabularyScreen -@Preview +val items = listOf( + Screen.VocabularyList, + Screen.Game +) + + +@Preview @Composable fun MyApp() { val navController = rememberNavController() -/* Scaffold( + Scaffold( bottomBar = { - BottomNavigation { - BottomNavigationItem(selected = , onClick = { /*TODO*/ }, icon = { /*TODO*/ }){ - - } + BottomNavigation { + val navBackStackEntry by navController.currentBackStackEntryAsState() + val currentDestination = navBackStackEntry?.destination + items.forEach { screen -> + BottomNavigationItem( + label = { Text(stringResource(screen.resourceId)) }, + selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true, + onClick = { + navController.navigate(screen.route) { + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + }, + icon = { + Icon( + Icons.Filled.Favorite, contentDescription = null + ) + }) + } } - } - )*/ - NavHost(navController, startDestination = "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() { -// + } + ){ innerPadding -> + NavHost(navController, startDestination = Screen.Home.route, Modifier.padding(innerPadding)) { + composable(Screen.Home.route) { HomeScreen( NavigateToRegister = { navController.navigate(Screen.Register.route)} ,NavigateToLogin = { navController.navigate(Screen.Game.route) }) } + composable(Screen.VocabularyList.route) { VocabularyScreen(onNavigateToList = { navController.popBackStack() }) } + composable(Screen.Register.route) { RegisterScreen(NavigateToApp = { navController.navigate(Screen.VocabularyList.route) }) } + composable(Screen.Game.route){ GameScreen() { } } } } -@Composable -fun BottomNav(){ - } - @Composable fun HomeScreen(NavigateToRegister: () -> Unit,NavigateToLogin: () -> Unit ){ @@ -89,18 +115,18 @@ fun HomeScreen(NavigateToRegister: () -> Unit,NavigateToLogin: () -> Unit ){ .align(alignment = Alignment.CenterHorizontally)) Button( onClick = { NavigateToLogin() }, modifier = Modifier - .padding(10.dp) - .width(500.dp) - .height(80.dp) - .align(alignment = Alignment.CenterHorizontally)) { + .padding(10.dp) + .width(500.dp) + .height(80.dp) + .align(alignment = Alignment.CenterHorizontally)) { Text(text = stringResource(id = R.string.logIn), fontSize = 20.sp) } Button(onClick = { NavigateToRegister() },modifier = Modifier - .width(500.dp) - .padding(10.dp) - .height(80.dp) - .align(alignment = Alignment.CenterHorizontally)) { + .width(500.dp) + .padding(10.dp) + .height(80.dp) + .align(alignment = Alignment.CenterHorizontally)) { Text(text = stringResource(id = R.string.signIn), fontSize = 20.sp) } } diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/view/Screen.kt b/Project/android/app/src/main/java/sae/android/sae_2a/view/Screen.kt new file mode 100644 index 0000000..81cc02b --- /dev/null +++ b/Project/android/app/src/main/java/sae/android/sae_2a/view/Screen.kt @@ -0,0 +1,16 @@ +package sae.android.sae_2a.view + +import androidx.annotation.StringRes +import sae.android.sae_2a.R + +sealed class Screen(val route: String, @StringRes val resourceId: Int) { + object Profile : Screen("profile", R.string.profilePicture) + object Home : Screen("HomeScreen", R.string.home) + object VocabularyList : Screen("VocabularyListScreen", R.string.voc_image_description) + object Game : Screen("GameScreen", R.string.game) + object Register : Screen("RegisterScreen", R.string.register) + + + + +} \ 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 e3f848f..b933d62 100644 --- a/Project/android/app/src/main/res/values/strings.xml +++ b/Project/android/app/src/main/res/values/strings.xml @@ -10,7 +10,9 @@ Created by\u0020 Unknown Profile Picture + Game Home + Register Account Details Change Password \ No newline at end of file From de4354dd559d175e392a4cc4f6f24e3918081bea Mon Sep 17 00:00:00 2001 From: "patrick.brugiere" Date: Fri, 29 Mar 2024 16:24:54 +0100 Subject: [PATCH 2/4] bottomNavBar fini --- .../java/sae/android/sae_2a/data/Screen.kt | 23 +++++ .../sae/android/sae_2a/view/HomeScreen.kt | 83 ++++++++++--------- .../java/sae/android/sae_2a/view/Screen.kt | 16 ---- .../app/src/main/res/values/strings.xml | 2 +- 4 files changed, 68 insertions(+), 56 deletions(-) create mode 100644 Project/android/app/src/main/java/sae/android/sae_2a/data/Screen.kt delete mode 100644 Project/android/app/src/main/java/sae/android/sae_2a/view/Screen.kt diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/data/Screen.kt b/Project/android/app/src/main/java/sae/android/sae_2a/data/Screen.kt new file mode 100644 index 0000000..34ec444 --- /dev/null +++ b/Project/android/app/src/main/java/sae/android/sae_2a/data/Screen.kt @@ -0,0 +1,23 @@ +package sae.android.sae_2a.data + +import androidx.annotation.StringRes +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.AccountBox +import androidx.compose.material.icons.filled.Home +import androidx.compose.material.icons.filled.Menu +import androidx.compose.ui.graphics.vector.ImageVector +import sae.android.sae_2a.R + +sealed class Screen(val route: String, @StringRes val resourceId: Int, val image: ImageVector) { + object Profile : Screen("profile", R.string.profilePicture, Icons.Filled.AccountBox ) + object Home : Screen("profileScreen", R.string.home, Icons.Filled.Home ) + object VocabularyList : Screen("VocabularyListScreen", R.string.voc_image_description, Icons.Filled.Menu) + object Game : Screen("GameScreen", R.string.game ,Icons.Filled.Home) + object Register : Screen("RegisterScreen", R.string.register,Icons.Filled.Home ) + object Login : Screen("LoginScreen", R.string.logIn , Icons.Filled.Home) + + + + + +} \ 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 3ac4b34..25cf34a 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 @@ -12,8 +12,6 @@ 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.material.icons.Icons -import androidx.compose.material.icons.filled.Favorite import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.Scaffold @@ -37,11 +35,13 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import sae.android.sae_2a.R +import sae.android.sae_2a.data.Screen import sae.android.sae_2a.game.VocabularyScreen val items = listOf( + Screen.Game, Screen.VocabularyList, - Screen.Game + Screen.Profile ) @@ -50,44 +50,49 @@ val items = listOf( fun MyApp() { val navController = rememberNavController() Scaffold( - bottomBar = { - BottomNavigation { - val navBackStackEntry by navController.currentBackStackEntryAsState() - val currentDestination = navBackStackEntry?.destination - items.forEach { screen -> - BottomNavigationItem( - label = { Text(stringResource(screen.resourceId)) }, - selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true, - onClick = { - navController.navigate(screen.route) { - popUpTo(navController.graph.findStartDestination().id) { - saveState = true - } - launchSingleTop = true - restoreState = true - } - }, - icon = { - Icon( - Icons.Filled.Favorite, contentDescription = null - ) - }) - } - } - } - ){ innerPadding -> - NavHost(navController, startDestination = Screen.Home.route, Modifier.padding(innerPadding)) { - composable(Screen.Home.route) { HomeScreen( NavigateToRegister = { navController.navigate(Screen.Register.route)} ,NavigateToLogin = { navController.navigate(Screen.Game.route) }) } - composable(Screen.VocabularyList.route) { VocabularyScreen(onNavigateToList = { navController.popBackStack() }) } - composable(Screen.Register.route) { RegisterScreen(NavigateToApp = { navController.navigate(Screen.VocabularyList.route) }) } - composable(Screen.Game.route){ GameScreen() { - } } - - + bottomBar = { + val navBackStackEntry by navController.currentBackStackEntryAsState() + val currentDestination = navBackStackEntry?.destination + if (currentDestination?.route !in listOf(Screen.Home.route, Screen.Login.route , Screen.Register.route)) { + BottomNavigation { + items.forEach { screen -> + BottomNavigationItem( + modifier = Modifier + .background(Color.Gray), + label = { Text(stringResource(screen.resourceId)) }, + selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true, + onClick = { + navController.navigate(screen.route) { + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + }, + icon = { + Icon( + screen.image , contentDescription = null + ) + }) + } + } + } + } + ) { innerPadding -> + NavHost(navController, startDestination = Screen.Home.route, Modifier.padding(innerPadding)) { + composable(Screen.Home.route) { HomeScreen(NavigateToRegister = { navController.navigate( + Screen.Register.route) }, NavigateToLogin = { navController.navigate(Screen.Login.route) }) } + composable(Screen.VocabularyList.route) { VocabularyScreen(onNavigateToList = { navController.popBackStack() }) } + composable(Screen.Register.route) { RegisterScreen(NavigateToApp = { navController.navigate( + Screen.VocabularyList.route) }) } + composable(Screen.Game.route){ GameScreen() {} } + composable(Screen.Login.route){LoginScreen(onLoginClicked = { _, _ -> })} + composable(Screen.Profile.route){profileScreen()} + } } - -} } + @Composable fun HomeScreen(NavigateToRegister: () -> Unit,NavigateToLogin: () -> Unit ){ diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/view/Screen.kt b/Project/android/app/src/main/java/sae/android/sae_2a/view/Screen.kt deleted file mode 100644 index 81cc02b..0000000 --- a/Project/android/app/src/main/java/sae/android/sae_2a/view/Screen.kt +++ /dev/null @@ -1,16 +0,0 @@ -package sae.android.sae_2a.view - -import androidx.annotation.StringRes -import sae.android.sae_2a.R - -sealed class Screen(val route: String, @StringRes val resourceId: Int) { - object Profile : Screen("profile", R.string.profilePicture) - object Home : Screen("HomeScreen", R.string.home) - object VocabularyList : Screen("VocabularyListScreen", R.string.voc_image_description) - object Game : Screen("GameScreen", R.string.game) - object Register : Screen("RegisterScreen", R.string.register) - - - - -} \ 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 b933d62..8b56d0e 100644 --- a/Project/android/app/src/main/res/values/strings.xml +++ b/Project/android/app/src/main/res/values/strings.xml @@ -6,7 +6,7 @@ Log Out Sign In Password - Picture representing vocabulary + Vocabulary Created by\u0020 Unknown Profile Picture From 051ddf79784ac86d482371bf05695668fa968c17 Mon Sep 17 00:00:00 2001 From: "patrick.brugiere" Date: Mon, 1 Apr 2024 22:00:12 +0200 Subject: [PATCH 3/4] ajout coroutine pour le login (par encore implementer) --- Project/android/app/build.gradle.kts | 1 + .../sae/android/sae_2a/VM/LoginViewModel.kt | 28 +++++++++++ .../android/sae_2a/data/LoginRepository.kt | 47 +++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 Project/android/app/src/main/java/sae/android/sae_2a/VM/LoginViewModel.kt create mode 100644 Project/android/app/src/main/java/sae/android/sae_2a/data/LoginRepository.kt diff --git a/Project/android/app/build.gradle.kts b/Project/android/app/build.gradle.kts index 2b70e88..4af4e43 100644 --- a/Project/android/app/build.gradle.kts +++ b/Project/android/app/build.gradle.kts @@ -50,6 +50,7 @@ android { } dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9") 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") diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/VM/LoginViewModel.kt b/Project/android/app/src/main/java/sae/android/sae_2a/VM/LoginViewModel.kt new file mode 100644 index 0000000..e3a3eac --- /dev/null +++ b/Project/android/app/src/main/java/sae/android/sae_2a/VM/LoginViewModel.kt @@ -0,0 +1,28 @@ +package sae.android.sae_2a.VM + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope + +import kotlinx.coroutines.launch +import sae.android.sae_2a.data.LoginRepository +import sae.android.sae_2a.data.LoginResponse + +class LoginViewModel( + private val loginRepository: LoginRepository +): ViewModel() { + + fun login( token: String) { + viewModelScope.launch { + val jsonBody = "{ token: \"$token\"}" + val result = try { + loginRepository.makeLoginRequest(jsonBody) + } catch(e: Exception) { + sae.android.sae_2a.data.Result.Error(Exception("Network request failed")) + } + when (result) { + is sae.android.sae_2a.data.Result.Success -> print("sucess") + else -> ("error") + } + } +} +} \ No newline at end of file diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/data/LoginRepository.kt b/Project/android/app/src/main/java/sae/android/sae_2a/data/LoginRepository.kt new file mode 100644 index 0000000..e10d39b --- /dev/null +++ b/Project/android/app/src/main/java/sae/android/sae_2a/data/LoginRepository.kt @@ -0,0 +1,47 @@ +package sae.android.sae_2a.data + +import android.provider.ContactsContract.CommonDataKinds.Website.URL +import org.json.JSONObject +import java.io.InputStream +import java.net.HttpURLConnection +import java.net.URL + +class LoginResponseParser { + fun parse(inputStream: InputStream): LoginResponse { + val responseString = inputStream.bufferedReader().use { it.readText() } + // Supposons que la réponse du serveur soit un JSON contenant une clé "token" + val jsonObject = JSONObject(responseString) + val token = jsonObject.getString("token") + return LoginResponse(token) + } +} + +data class LoginResponse( + val token: String +) + +sealed class Result { + data class Success(val data: T) : Result() + data class Error(val exception: Exception) : Result() +} +class LoginRepository(private val responseParser: LoginResponseParser) { + + private val loginUrl = "https://codefirst.iut.uca.fr/containers/antoinejourdain-api_container/Auth/token" + + // Function that makes the network request, blocking the current thread + fun makeLoginRequest( + jsonBody: String + ): Result { + val url = URL(loginUrl) + (url.openConnection() as? HttpURLConnection)?.run { + requestMethod = "POST" + setRequestProperty("Content-Type", "application/json; utf-8") + setRequestProperty("Accept", "application/json") + doOutput = true + outputStream.write(jsonBody.toByteArray()) + return Result.Success(responseParser.parse(inputStream)) + } + return Result.Error(Exception("Cannot open HttpURLConnection")) + } + + } From c9647fa011cbcbd540c9f27274b484e3cad6890a Mon Sep 17 00:00:00 2001 From: "patrick.brugiere" Date: Tue, 2 Apr 2024 15:21:42 +0200 Subject: [PATCH 4/4] =?UTF-8?q?avanc=C3=A9=20sur=20les=20requetes=20retrof?= =?UTF-8?q?it?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Project/android/app/build.gradle.kts | 1 + .../java/sae/android/sae_2a/data/Group.kt | 8 ++++ .../sae/android/sae_2a/data/Vocabulary.kt | 5 ++- .../sae/android/sae_2a/service/ApiClient.kt | 27 ++++++++++++++ .../android/sae_2a/service/GroupService.kt | 22 +++++++++++ .../sae/android/sae_2a/service/UserService.kt | 37 +++++++++++++++++++ .../sae_2a/view/VocabularyListScreen.kt | 8 ++-- .../sae/android/sae_2a/view/connection.kt | 4 ++ 8 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 Project/android/app/src/main/java/sae/android/sae_2a/data/Group.kt create mode 100644 Project/android/app/src/main/java/sae/android/sae_2a/service/ApiClient.kt create mode 100644 Project/android/app/src/main/java/sae/android/sae_2a/service/GroupService.kt create mode 100644 Project/android/app/src/main/java/sae/android/sae_2a/service/UserService.kt diff --git a/Project/android/app/build.gradle.kts b/Project/android/app/build.gradle.kts index 4af4e43..a636dd0 100644 --- a/Project/android/app/build.gradle.kts +++ b/Project/android/app/build.gradle.kts @@ -50,6 +50,7 @@ android { } dependencies { + implementation ("com.squareup.retrofit2:converter-gson:2.9.0") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9") implementation("androidx.compose.material:material:1.6.4") implementation("androidx.core:core-ktx:1.12.0") diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/data/Group.kt b/Project/android/app/src/main/java/sae/android/sae_2a/data/Group.kt new file mode 100644 index 0000000..f0755d8 --- /dev/null +++ b/Project/android/app/src/main/java/sae/android/sae_2a/data/Group.kt @@ -0,0 +1,8 @@ +package sae.android.sae_2a.data + +data class Group( + val id : Long, + val num : Int, + val year : Int, + val sector : 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 36bf9ba..e3b8383 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 @@ -1,7 +1,8 @@ package sae.android.sae_2a.data data class Vocabulary( - val name: String, - val aut: String?, + val word : String, + val LangueName: String, + val words: Map ) \ No newline at end of file diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/service/ApiClient.kt b/Project/android/app/src/main/java/sae/android/sae_2a/service/ApiClient.kt new file mode 100644 index 0000000..9dca1d3 --- /dev/null +++ b/Project/android/app/src/main/java/sae/android/sae_2a/service/ApiClient.kt @@ -0,0 +1,27 @@ +package sae.android.sae_2a.service + +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import okhttp3.OkHttpClient +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +object ApiClient { + private val BASE_URL: String = "https://codefirst.iut.uca.fr/containers/antoinejourdain-api_container/api/v1/" + + private val httpClient : OkHttpClient by lazy { + OkHttpClient.Builder().build() + } + + private val gson : Gson by lazy { + GsonBuilder().setLenient().create() + } + + private val retrofit : Retrofit by lazy { + Retrofit.Builder() + .baseUrl(BASE_URL) + .client(httpClient) + .addConverterFactory(GsonConverterFactory.create(gson)) + .build() + } +} \ No newline at end of file diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/service/GroupService.kt b/Project/android/app/src/main/java/sae/android/sae_2a/service/GroupService.kt new file mode 100644 index 0000000..50e60ce --- /dev/null +++ b/Project/android/app/src/main/java/sae/android/sae_2a/service/GroupService.kt @@ -0,0 +1,22 @@ +package sae.android.sae_2a.service + +import retrofit2.Response +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Path +import sae.android.sae_2a.data.Group +import sae.android.sae_2a.data.Vocabulary + +interface GroupService { + + @GET("Group") + suspend fun getVocabulary(@Body index : Int, @Body count : Int) : Response> + + @GET("Group/{id}") + suspend fun getVocById(@Path("id") id : Int) : Response + + + + + +} \ No newline at end of file diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/service/UserService.kt b/Project/android/app/src/main/java/sae/android/sae_2a/service/UserService.kt new file mode 100644 index 0000000..9d3ba3f --- /dev/null +++ b/Project/android/app/src/main/java/sae/android/sae_2a/service/UserService.kt @@ -0,0 +1,37 @@ +package sae.android.sae_2a.service + +import retrofit2.Response +import retrofit2.http.Body +import retrofit2.http.DELETE +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.PUT +import retrofit2.http.Path +import retrofit2.http.Query +import sae.android.sae_2a.data.Vocabulary + + +interface UserService { + + @GET("Vocabulary") + suspend fun getVocabulary(@Body index : Int, @Body count: Int) : Response> + + @GET("Vocabulary/{word}") + suspend fun getVocByWord(@Path("word") word : String) : Response + + @PUT("Vocabulary/{vocabulary}") + suspend fun updateVoc(@Path("vocabulary") vocabulary: Vocabulary) : Response + + @DELETE("Vocabulary/{word}") + suspend fun deleteVoc(@Path("word") word: String) : Response + + @POST("Vocabulary/{vocabulary}") + suspend fun addVoc(@Path("vocabulary") vocabulary: Vocabulary) : Response + + @GET("Vocabulary/langue/{langue}") + suspend fun getByLangue(@Path("langue") langue : String,@Body index : Int, @Body count : Int) : Response + + @POST("Vocabulary/AddTranslation") + suspend fun addTranslation(@Query("vocId") vocId : String,@Query("translationId") translationId : Long ) : Response + +} \ No newline at end of file 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 2c281e8..ae1ba75 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 @@ -91,7 +91,7 @@ fun VocCard(vocabulary: Vocabulary){ modifier = Modifier .size(150.dp, 150.dp) .border(2.dp, Color.DarkGray, shape = RoundedCornerShape(8.dp, 8.dp))) { - Text(vocabulary.name, + Text(vocabulary.word, modifier = Modifier .fillMaxWidth() .border(2.dp, Color.DarkGray, shape = RoundedCornerShape(8.dp, 8.dp)), @@ -104,7 +104,7 @@ fun VocCard(vocabulary: Vocabulary){ .weight(1f) .align(Alignment.CenterHorizontally) ) - Text( stringResource(id = R.string.created_by) + (vocabulary.aut ?: stringResource(id = R.string.unknown)), + Text( stringResource(id = R.string.created_by) + (vocabulary.word ?: stringResource(id = R.string.unknown)), modifier = Modifier .wrapContentHeight(Alignment.Bottom) .align(Alignment.End) @@ -135,12 +135,12 @@ fun VocabularyDetails(vocabulary: Vocabulary){ stickyHeader( ) { Text( - vocabulary.name, fontSize = 30.sp, + vocabulary.LangueName, fontSize = 30.sp, textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth() ) Text( - stringResource(R.string.created_by) + (vocabulary.aut + stringResource(R.string.created_by) + (vocabulary.word ?: stringResource(id = R.string.unknown)), fontSize = 20.sp, textAlign = TextAlign.Center, diff --git a/Project/android/app/src/main/java/sae/android/sae_2a/view/connection.kt b/Project/android/app/src/main/java/sae/android/sae_2a/view/connection.kt index 5657c4a..a6b6cc3 100644 --- a/Project/android/app/src/main/java/sae/android/sae_2a/view/connection.kt +++ b/Project/android/app/src/main/java/sae/android/sae_2a/view/connection.kt @@ -22,11 +22,15 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import sae.android.sae_2a.R +import sae.android.sae_2a.VM.LoginViewModel +import sae.android.sae_2a.data.LoginRepository +import sae.android.sae_2a.data.LoginResponseParser @Composable fun LoginScreen(onLoginClicked: (String, String) -> Unit) { var username by remember { mutableStateOf("") } var password by remember { mutableStateOf("") } + var login = LoginViewModel(LoginRepository(LoginResponseParser())).login("") Column( modifier = Modifier