Added connection to the api (login only)

This commit is contained in:
Mariano Riefolo 2024-04-05 22:33:29 +02:00
parent 7067cf5072
commit 2d59ab8782
9 changed files with 78 additions and 13 deletions

View File

@ -54,7 +54,7 @@ dependencies {
implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
implementation("androidx.activity:activity-compose:1.8.2") 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")
implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.ui:ui-tooling-preview")
@ -62,7 +62,7 @@ dependencies {
testImplementation("junit:junit:4.13.2") testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") 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") androidTestImplementation("androidx.compose.ui:ui-test-junit4")
debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-tooling")
debugImplementation("androidx.compose.ui:ui-test-manifest") debugImplementation("androidx.compose.ui:ui-test-manifest")
@ -71,11 +71,16 @@ dependencies {
implementation("io.github.raamcosta.compose-destinations:core:1.0.2-beta") implementation("io.github.raamcosta.compose-destinations:core:1.0.2-beta")
ksp("io.github.raamcosta.compose-destinations:ksp: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("com.google.accompanist:accompanist-permissions:0.34.0")
implementation("androidx.camera:camera-camera2:1.3.1") implementation("androidx.camera:camera-camera2:1.3.2")
implementation("androidx.camera:camera-lifecycle:1.3.1") implementation("androidx.camera:camera-lifecycle:1.3.2")
implementation("androidx.camera:camera-view:1.3.1") implementation("androidx.camera:camera-view:1.3.2")
implementation("com.google.mlkit:barcode-scanning:17.2.0") 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")
} }

View File

@ -6,6 +6,8 @@
<uses-feature android:name="android.hardware.camera.autofocus"/> <uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.INTERNET"/>
<application <application
android:allowBackup="true" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"

View File

@ -0,0 +1,13 @@
package it.edu.cassandroferminervi.flowschool.remote
import it.edu.cassandroferminervi.flowschool.remote.dto.LoginResult
import retrofit2.Response
import retrofit2.http.Field
import retrofit2.http.FormUrlEncoded
import retrofit2.http.POST
interface ApiService {
@FormUrlEncoded
@POST("login.php")
suspend fun postLogin(@Field("username") code: String, @Field("password") password: String): Response<LoginResult>
}

View File

@ -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)
}
}

View File

@ -0,0 +1,3 @@
package it.edu.cassandroferminervi.flowschool.remote.dto
data class LoginResult(val token: String?, val error: String?)

View File

@ -19,7 +19,7 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator
@Destination @Destination
@Composable @Composable
fun HomeScreen(navigator: DestinationsNavigator) { fun HomeScreen(navigator: DestinationsNavigator, token: String) {
Column( Column(
verticalArrangement = Arrangement.Center, verticalArrangement = Arrangement.Center,
modifier = Modifier modifier = Modifier
@ -27,13 +27,13 @@ fun HomeScreen(navigator: DestinationsNavigator) {
.padding(horizontal = 50.dp) .padding(horizontal = 50.dp)
) { ) {
Button(onClick = { Button(onClick = {
navigator.navigate(PermissionScreenDestination) navigator.navigate(PermissionScreenDestination(token))
}, modifier = Modifier.align(Alignment.CenterHorizontally)) { }, modifier = Modifier.align(Alignment.CenterHorizontally)) {
Text("Scannerizza codice QR") Text("Scannerizza codice QR")
} }
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(8.dp))
Button(onClick = { Button(onClick = {
navigator.navigate(SearchingScreenDestination) navigator.navigate(SearchingScreenDestination(token))
}, modifier = Modifier.align(Alignment.CenterHorizontally)) { }, modifier = Modifier.align(Alignment.CenterHorizontally)) {
Text("Cerca professore") Text("Cerca professore")
} }

View File

@ -1,5 +1,6 @@
package it.edu.cassandroferminervi.flowschool.screens package it.edu.cassandroferminervi.flowschool.screens
import android.widget.Toast
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@ -23,10 +24,12 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation 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.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import it.edu.cassandroferminervi.flowschool.R import it.edu.cassandroferminervi.flowschool.R
import it.edu.cassandroferminervi.flowschool.remote.RetrofitInstance
import kotlinx.coroutines.launch
@Destination(start = true) @Destination(start = true)
@Composable @Composable
@ -44,6 +50,9 @@ fun LoginScreen(navigator: DestinationsNavigator) {
var password by remember { mutableStateOf("") } var password by remember { mutableStateOf("") }
var passwordVisible by remember { mutableStateOf(false) } var passwordVisible by remember { mutableStateOf(false) }
val coroutineScope = rememberCoroutineScope()
val context = LocalContext.current
Column( Column(
verticalArrangement = Arrangement.Center, verticalArrangement = Arrangement.Center,
modifier = Modifier modifier = Modifier
@ -62,7 +71,7 @@ fun LoginScreen(navigator: DestinationsNavigator) {
TextField( TextField(
value = code, value = code,
onValueChange = { code = it }, onValueChange = { code = it },
label = { Text("Codice") }, label = { Text("Username") },
singleLine = true, singleLine = true,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
@ -89,7 +98,17 @@ fun LoginScreen(navigator: DestinationsNavigator) {
) )
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(8.dp))
Button(onClick = { 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)) { }, modifier = Modifier.align(Alignment.End)) {
Text("Accedi") Text("Accedi")
} }

View File

@ -16,7 +16,7 @@ import com.ramcosta.composedestinations.annotation.Destination
@OptIn(ExperimentalPermissionsApi::class) @OptIn(ExperimentalPermissionsApi::class)
@Destination @Destination
@Composable @Composable
fun PermissionScreen() { fun PermissionScreen(token: String) {
val cameraPermissionState = rememberPermissionState(android.Manifest.permission.CAMERA) val cameraPermissionState = rememberPermissionState(android.Manifest.permission.CAMERA)
if (cameraPermissionState.status.isGranted) { if (cameraPermissionState.status.isGranted) {

View File

@ -26,7 +26,7 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator
@Destination @Destination
@Composable @Composable
fun SearchingScreen(navigator: DestinationsNavigator) { fun SearchingScreen(navigator: DestinationsNavigator, token: String) {
val teachers = listOf( val teachers = listOf(
"Mario Rossi", "Mario Rossi",
"Michele Verdi", "Michele Verdi",