From 2d59ab8782e8613fea9c9565dfc79092a9cce570 Mon Sep 17 00:00:00 2001 From: Mariano Riefolo Date: Fri, 5 Apr 2024 22:33:29 +0200 Subject: [PATCH] Added connection to the api (login only) --- app/build.gradle.kts | 17 +++++++++----- app/src/main/AndroidManifest.xml | 2 ++ .../flowschool/remote/ApiService.kt | 13 +++++++++++ .../flowschool/remote/RetrofitInstance.kt | 23 +++++++++++++++++++ .../flowschool/remote/dto/LoginResult.kt | 3 +++ .../flowschool/screens/HomeScreen.kt | 6 ++--- .../flowschool/screens/LoginScreen.kt | 23 +++++++++++++++++-- .../flowschool/screens/PermissionScreen.kt | 2 +- .../flowschool/screens/SearchingScreen.kt | 2 +- 9 files changed, 78 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/it/edu/cassandroferminervi/flowschool/remote/ApiService.kt create mode 100644 app/src/main/java/it/edu/cassandroferminervi/flowschool/remote/RetrofitInstance.kt create mode 100644 app/src/main/java/it/edu/cassandroferminervi/flowschool/remote/dto/LoginResult.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 252b4f2..e8c3c38 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -54,7 +54,7 @@ dependencies { implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") implementation("androidx.activity:activity-compose:1.8.2") - implementation(platform("androidx.compose:compose-bom:2024.02.01")) + implementation(platform("androidx.compose:compose-bom:2024.04.00")) implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") @@ -62,7 +62,7 @@ dependencies { testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2024.02.01")) + androidTestImplementation(platform("androidx.compose:compose-bom:2024.04.00")) androidTestImplementation("androidx.compose.ui:ui-test-junit4") debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest") @@ -71,11 +71,16 @@ dependencies { implementation("io.github.raamcosta.compose-destinations:core:1.0.2-beta") ksp("io.github.raamcosta.compose-destinations:ksp:1.0.2-beta") - implementation("androidx.compose.material:material-icons-extended:1.6.2") + implementation("androidx.compose.material:material-icons-extended:1.6.5") implementation("com.google.accompanist:accompanist-permissions:0.34.0") - implementation("androidx.camera:camera-camera2:1.3.1") - implementation("androidx.camera:camera-lifecycle:1.3.1") - implementation("androidx.camera:camera-view:1.3.1") + implementation("androidx.camera:camera-camera2:1.3.2") + implementation("androidx.camera:camera-lifecycle:1.3.2") + implementation("androidx.camera:camera-view:1.3.2") implementation("com.google.mlkit:barcode-scanning:17.2.0") + + implementation("com.squareup.retrofit2:retrofit:2.11.0") + implementation("com.squareup.retrofit2:converter-gson:2.11.0") + implementation("com.squareup.okhttp3:okhttp:5.0.0-alpha.12") + implementation("com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.12") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9ebabb0..defb4c0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,8 @@ + + +} \ No newline at end of file diff --git a/app/src/main/java/it/edu/cassandroferminervi/flowschool/remote/RetrofitInstance.kt b/app/src/main/java/it/edu/cassandroferminervi/flowschool/remote/RetrofitInstance.kt new file mode 100644 index 0000000..a6725c1 --- /dev/null +++ b/app/src/main/java/it/edu/cassandroferminervi/flowschool/remote/RetrofitInstance.kt @@ -0,0 +1,23 @@ +package it.edu.cassandroferminervi.flowschool.remote + +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +object RetrofitInstance { + private val client = OkHttpClient.Builder() + .addInterceptor(HttpLoggingInterceptor().apply { + level = HttpLoggingInterceptor.Level.BODY + }) + .build() + + val api: ApiService by lazy { + Retrofit.Builder() + .baseUrl("https://flowschool.riefolo.me/api/") + .addConverterFactory(GsonConverterFactory.create()) + .client(client) + .build() + .create(ApiService::class.java) + } +} \ No newline at end of file diff --git a/app/src/main/java/it/edu/cassandroferminervi/flowschool/remote/dto/LoginResult.kt b/app/src/main/java/it/edu/cassandroferminervi/flowschool/remote/dto/LoginResult.kt new file mode 100644 index 0000000..3e46a46 --- /dev/null +++ b/app/src/main/java/it/edu/cassandroferminervi/flowschool/remote/dto/LoginResult.kt @@ -0,0 +1,3 @@ +package it.edu.cassandroferminervi.flowschool.remote.dto + +data class LoginResult(val token: String?, val error: String?) diff --git a/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/HomeScreen.kt b/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/HomeScreen.kt index 4722183..a819f82 100644 --- a/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/HomeScreen.kt +++ b/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/HomeScreen.kt @@ -19,7 +19,7 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator @Destination @Composable -fun HomeScreen(navigator: DestinationsNavigator) { +fun HomeScreen(navigator: DestinationsNavigator, token: String) { Column( verticalArrangement = Arrangement.Center, modifier = Modifier @@ -27,13 +27,13 @@ fun HomeScreen(navigator: DestinationsNavigator) { .padding(horizontal = 50.dp) ) { Button(onClick = { - navigator.navigate(PermissionScreenDestination) + navigator.navigate(PermissionScreenDestination(token)) }, modifier = Modifier.align(Alignment.CenterHorizontally)) { Text("Scannerizza codice QR") } Spacer(modifier = Modifier.height(8.dp)) Button(onClick = { - navigator.navigate(SearchingScreenDestination) + navigator.navigate(SearchingScreenDestination(token)) }, modifier = Modifier.align(Alignment.CenterHorizontally)) { Text("Cerca professore") } diff --git a/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/LoginScreen.kt b/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/LoginScreen.kt index 4cd9681..bf0440e 100644 --- a/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/LoginScreen.kt +++ b/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/LoginScreen.kt @@ -1,5 +1,6 @@ package it.edu.cassandroferminervi.flowschool.screens +import android.widget.Toast import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -23,10 +24,12 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation @@ -36,6 +39,9 @@ import com.ramcosta.composedestinations.HomeScreenDestination import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import it.edu.cassandroferminervi.flowschool.R +import it.edu.cassandroferminervi.flowschool.remote.RetrofitInstance +import kotlinx.coroutines.launch + @Destination(start = true) @Composable @@ -44,6 +50,9 @@ fun LoginScreen(navigator: DestinationsNavigator) { var password by remember { mutableStateOf("") } var passwordVisible by remember { mutableStateOf(false) } + val coroutineScope = rememberCoroutineScope() + val context = LocalContext.current + Column( verticalArrangement = Arrangement.Center, modifier = Modifier @@ -62,7 +71,7 @@ fun LoginScreen(navigator: DestinationsNavigator) { TextField( value = code, onValueChange = { code = it }, - label = { Text("Codice") }, + label = { Text("Username") }, singleLine = true, modifier = Modifier.fillMaxWidth() ) @@ -89,7 +98,17 @@ fun LoginScreen(navigator: DestinationsNavigator) { ) Spacer(modifier = Modifier.height(8.dp)) Button(onClick = { - navigator.navigate(HomeScreenDestination) + coroutineScope.launch { + val response = RetrofitInstance.api.postLogin(code, password) + val loginResult = response.body() + + if (!response.isSuccessful || loginResult == null) + Toast.makeText(context, "Errore del server", Toast.LENGTH_LONG).show() + else if (!loginResult.token.isNullOrEmpty() && loginResult.error.isNullOrEmpty()) + navigator.navigate(HomeScreenDestination(loginResult.token)) + else + Toast.makeText(context, loginResult.error, Toast.LENGTH_LONG).show() + } }, modifier = Modifier.align(Alignment.End)) { Text("Accedi") } diff --git a/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/PermissionScreen.kt b/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/PermissionScreen.kt index 104701d..ac58697 100644 --- a/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/PermissionScreen.kt +++ b/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/PermissionScreen.kt @@ -16,7 +16,7 @@ import com.ramcosta.composedestinations.annotation.Destination @OptIn(ExperimentalPermissionsApi::class) @Destination @Composable -fun PermissionScreen() { +fun PermissionScreen(token: String) { val cameraPermissionState = rememberPermissionState(android.Manifest.permission.CAMERA) if (cameraPermissionState.status.isGranted) { diff --git a/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/SearchingScreen.kt b/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/SearchingScreen.kt index 36ff7fe..e1f1e0f 100644 --- a/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/SearchingScreen.kt +++ b/app/src/main/java/it/edu/cassandroferminervi/flowschool/screens/SearchingScreen.kt @@ -26,7 +26,7 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator @Destination @Composable -fun SearchingScreen(navigator: DestinationsNavigator) { +fun SearchingScreen(navigator: DestinationsNavigator, token: String) { val teachers = listOf( "Mario Rossi", "Michele Verdi",