diff --git a/app/src/main/java/com/example/nto_minipigs/MainActivity.kt b/app/src/main/java/com/example/nto_minipigs/MainActivity.kt index 96021b1..8fa74bb 100644 --- a/app/src/main/java/com/example/nto_minipigs/MainActivity.kt +++ b/app/src/main/java/com/example/nto_minipigs/MainActivity.kt @@ -33,6 +33,7 @@ import kotlinx.coroutines.runBlocking import kotlinx.serialization.Serializable import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue +import androidx.datastore.preferences.core.booleanPreferencesKey import com.example.nto_minipigs.ui.screens.QR.QRResultScreen import com.example.nto_minipigs.ui.screens.QR.QRScreen import com.example.nto_minipigs.ui.screens.QR.QRViewModel @@ -54,9 +55,7 @@ class MainActivity : ComponentActivity() { val mainViewModel = ViewModelProvider(this)[MainViewModel::class.java] val qrViewModel = ViewModelProvider(this)[QRViewModel::class.java] - val token = dataStore.getToken() - - Log.d("token", token.toString()) + val token = dataStore.getLogin() NavHost( navController = navController, @@ -64,7 +63,7 @@ class MainActivity : ComponentActivity() { ) { composable { LoginScreen( onNavigateToMain = { navController.popBackStack(); navController.navigate(route = Main) }, viewModel = loginViewModel, dataStore = dataStore ) } composable
{ MainScreen( viewModel = mainViewModel, dataStore = dataStore, navController = navController ) } - composable { QRScreen( navController = navController, viewModel = qrViewModel) } + composable { QRScreen( navController = navController, viewModel = qrViewModel, dataStore = dataStore) } composable { QRResultScreen( navController = navController, viewModel = qrViewModel ) } } } @@ -86,8 +85,46 @@ class UserData(private val context: Context) { settings[tokenKey] = data } + fun getLogin():String { + return runBlocking { context.dataStore.data.map { preferences -> + preferences[loginKey] + }.first().toString()} + } + + suspend fun updateLogin(data:String) = + context.dataStore.edit { settings -> + settings[loginKey] = data + } + + fun getPassword():String { + return runBlocking { context.dataStore.data.map { preferences -> + preferences[passwordKey] + }.first().toString()} + } + + suspend fun updatePassword(data:String) = + context.dataStore.edit { settings -> + settings[passwordKey] = data + } + + fun getAdmin():Boolean { + return runBlocking { + context.dataStore.data.map { preferences -> + preferences[adminKey] + }.first() == true + } + } + + suspend fun updateAdmin(data:Boolean) = + context.dataStore.edit { settings -> + settings[adminKey] = data + } + companion object { val tokenKey = stringPreferencesKey("Bearer") + val loginKey = stringPreferencesKey("Login") + val passwordKey = stringPreferencesKey("Password") + val adminKey = booleanPreferencesKey("IsAdmin") } } diff --git a/app/src/main/java/com/example/nto_minipigs/Retrofit/ApiService.kt b/app/src/main/java/com/example/nto_minipigs/Retrofit/ApiService.kt index 4d61d77..5d7351b 100644 --- a/app/src/main/java/com/example/nto_minipigs/Retrofit/ApiService.kt +++ b/app/src/main/java/com/example/nto_minipigs/Retrofit/ApiService.kt @@ -1,7 +1,7 @@ package com.example.nto_minipigs.Retrofit import com.example.nto_minipigs.Retrofit.Models.Auth -import com.example.nto_minipigs.Retrofit.Models.Data +import com.example.nto_minipigs.Retrofit.Models.AuthResponse import com.example.nto_minipigs.Retrofit.Models.Door import com.example.nto_minipigs.Retrofit.Models.DoorResponse import com.example.nto_minipigs.Retrofit.Models.User @@ -22,8 +22,8 @@ public interface ApiService { suspend fun info(@Header("Authorization") token: String): Response @PATCH("/api/open") - suspend fun open(@Body data: Door): Response + suspend fun open(@Header("Authorization") token: String, @Body data: Door): Response @POST("/api/login") - suspend fun login(@Body data: Auth): Response + suspend fun login(@Body data: Auth): Response } \ No newline at end of file diff --git a/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Data.kt b/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/AuthResponse.kt similarity index 51% rename from app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Data.kt rename to app/src/main/java/com/example/nto_minipigs/Retrofit/Models/AuthResponse.kt index c75e3ec..9075291 100644 --- a/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Data.kt +++ b/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/AuthResponse.kt @@ -1,5 +1,5 @@ package com.example.nto_minipigs.Retrofit.Models -data class Data( - val token: String +data class AuthResponse( + val admin: Boolean ) \ No newline at end of file diff --git a/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Entry.kt b/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Entry.kt new file mode 100644 index 0000000..6205c76 --- /dev/null +++ b/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Entry.kt @@ -0,0 +1,8 @@ +package com.example.nto_minipigs.Retrofit.Models + +data class Entry( + val id: Long, + val employee: Long, + val time: String, + val place: Place, +) diff --git a/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Place.kt b/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Place.kt new file mode 100644 index 0000000..1c01dbd --- /dev/null +++ b/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Place.kt @@ -0,0 +1,7 @@ +package com.example.nto_minipigs.Retrofit.Models + +data class Place( + val id: Long, + val value: Long, + val name: String, +) \ No newline at end of file diff --git a/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/User.kt b/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/User.kt index 69cd928..776a6cb 100644 --- a/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/User.kt +++ b/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/User.kt @@ -7,5 +7,6 @@ data class User( val password: String, val name: String, val photo: String, - val position: String + val position: String, + val entries: ArrayList ) \ No newline at end of file diff --git a/app/src/main/java/com/example/nto_minipigs/core/Constants.kt b/app/src/main/java/com/example/nto_minipigs/core/Constants.kt index bb0c4ff..06329cf 100644 --- a/app/src/main/java/com/example/nto_minipigs/core/Constants.kt +++ b/app/src/main/java/com/example/nto_minipigs/core/Constants.kt @@ -3,5 +3,5 @@ package com.example.nto_minipigs.core object Constants { const val SHARED_PREFS = "shared_prefs" const val EMAIL_KEY = "email_key" - const val SERVER_ADDRESS = "http:///192.168.99.212:5000" + const val SERVER_ADDRESS = "http://192.168.99.212:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginScreen.kt b/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginScreen.kt index 9675747..411fe32 100644 --- a/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginScreen.kt +++ b/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginScreen.kt @@ -1,5 +1,6 @@ package com.example.nto_minipigs.ui.screens.Login +import androidx.annotation.FontRes import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -19,6 +20,9 @@ import com.example.nto_minipigs.ui.theme.Nto_minipigsTheme import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import com.example.nto_minipigs.UserData @@ -35,6 +39,9 @@ fun LoginScreen(onNavigateToMain: () -> Unit, viewModel: LoginViewModel, dataSto Text( text = "MiniPigs", style = MaterialTheme.typography.displayMedium, + fontWeight = FontWeight.ExtraBold, + fontStyle = FontStyle.Italic, + color = MaterialTheme.colorScheme.primary, modifier = Modifier.padding(bottom = 36.dp) ) @@ -53,7 +60,7 @@ fun LoginScreen(onNavigateToMain: () -> Unit, viewModel: LoginViewModel, dataSto value = password, onValueChange = { password = it }, label = { Text("Password") }, - modifier = Modifier.padding(bottom = 12.dp), + modifier = Modifier.padding(bottom = 16.dp), shape = RoundedCornerShape(12.dp), ) diff --git a/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginViewModel.kt b/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginViewModel.kt index 720be02..efca7b9 100644 --- a/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginViewModel.kt +++ b/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginViewModel.kt @@ -17,7 +17,11 @@ class LoginViewModel :ViewModel() { val auth = Auth(login, password) val response = serviceApi.login(auth) if(response.isSuccessful) { - dataStore.updateToken(response.body()?.token.toString()) +// dataStore.updateToken(response.body()?.token.toString()) + dataStore.updateLogin(login) + dataStore.updatePassword(password) + Log.d("yenis", (response.body()?.admin == true).toString()) + dataStore.updateAdmin(response.body()?.admin == true) // dataStore.updateToken("") func() } diff --git a/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainScreen.kt b/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainScreen.kt index a904c76..35dbf8b 100644 --- a/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainScreen.kt +++ b/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainScreen.kt @@ -1,8 +1,8 @@ package com.example.nto_minipigs.ui.screens.Main +import android.util.Log import androidx.compose.foundation.Image 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.foundation.layout.Column @@ -15,43 +15,30 @@ import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.Logout -import androidx.compose.material.icons.filled.BookmarkRemove -import androidx.compose.material.icons.outlined.Logout import androidx.compose.material.icons.outlined.QrCode -import androidx.compose.material.icons.outlined.Search import androidx.compose.material3.Button -import androidx.compose.material3.ButtonColors -import androidx.compose.material3.Card import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.ElevatedCard import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedCard -import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Surface import androidx.compose.material3.Text -import androidx.compose.material3.rememberDateRangePickerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import com.example.nto_minipigs.ui.theme.Nto_minipigsTheme -import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState 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.draw.shadow -import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -60,7 +47,7 @@ import coil.compose.rememberAsyncImagePainter import com.example.nto_minipigs.Login import com.example.nto_minipigs.QR import com.example.nto_minipigs.UserData -import kotlinx.coroutines.coroutineScope +import com.example.nto_minipigs.ui.theme.Nto_minipigsTheme import kotlinx.coroutines.launch @@ -69,6 +56,8 @@ fun MainScreen( viewModel: MainViewModel, dataStore: UserData, navController: Na Nto_minipigsTheme { val data = viewModel.data.observeAsState() val token = dataStore.getToken() + val login = dataStore.getLogin() + val password = dataStore.getPassword() val coroutineScope = rememberCoroutineScope() Surface { when(val result = data.value){ @@ -85,6 +74,7 @@ fun MainScreen( viewModel: MainViewModel, dataStore: UserData, navController: Na } } is NetworkResponse.Success -> { + Log.d("yenis", result.data.entries.toString()) Column ( modifier = Modifier.fillMaxSize() ) { @@ -95,7 +85,13 @@ fun MainScreen( viewModel: MainViewModel, dataStore: UserData, navController: Na .height(200.dp), ) { IconButton( - onClick = { coroutineScope.launch { dataStore.updateToken("") }; navController.popBackStack(); navController.navigate(Login) }, + onClick = { coroutineScope.launch { + dataStore.updateToken(""); + dataStore.updateLogin(""); + dataStore.updateAdmin(false); + dataStore.updatePassword("") }; + navController.popBackStack(); + navController.navigate(Login) }, modifier = Modifier .align(Alignment.TopEnd) .size(20.dp) @@ -161,21 +157,23 @@ fun MainScreen( viewModel: MainViewModel, dataStore: UserData, navController: Na .fillMaxSize() .background(MaterialTheme.colorScheme.surfaceContainerLow, RoundedCornerShape(topEnd = 24.dp , topStart = 24.dp)) ) { - Column( + LazyColumn( modifier = Modifier - .fillMaxSize() + .fillMaxWidth() .padding(horizontal = 20.dp) .padding(top = 8.dp) - .verticalScroll(rememberScrollState()) ) { - for(i in 1..24) { + items( + items = result.data.entries, + key = { item -> item.id } + ) { entry -> OutlinedCard( modifier = Modifier .fillMaxWidth() .padding(top = 12.dp) ) { Text( - text = "4am 141", + text = entry.time, style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Light, modifier = Modifier @@ -183,7 +181,7 @@ fun MainScreen( viewModel: MainViewModel, dataStore: UserData, navController: Na .padding(top = 12.dp) ) Text( - text = "Dildos factory", + text = entry.place.name, style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Normal, modifier = Modifier @@ -194,7 +192,7 @@ fun MainScreen( viewModel: MainViewModel, dataStore: UserData, navController: Na } } Button( - onClick = {navController.navigate(QR) }, + onClick = { navController.navigate(QR) }, shape = CircleShape, modifier = Modifier .align(Alignment.BottomEnd) @@ -213,7 +211,7 @@ fun MainScreen( viewModel: MainViewModel, dataStore: UserData, navController: Na } LaunchedEffect(Unit) { - viewModel.Fetch(token) + viewModel.Fetch(login, password) } } } diff --git a/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainViewModel.kt b/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainViewModel.kt index 7a4b7ac..4bf43ea 100644 --- a/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainViewModel.kt +++ b/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainViewModel.kt @@ -1,14 +1,13 @@ package com.example.nto_minipigs.ui.screens.Main -import android.util.Log +import RetrofitClient import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.example.nto_minipigs.Retrofit.Models.Auth import com.example.nto_minipigs.Retrofit.Models.User -import com.example.nto_minipigs.UserData import kotlinx.coroutines.launch +import okhttp3.Credentials class MainViewModel: ViewModel() { private val serviceApi = RetrofitClient.apiService @@ -16,13 +15,14 @@ class MainViewModel: ViewModel() { private val _data = MutableLiveData>() val data : LiveData> = _data - fun Fetch(token: String?) { + fun Fetch(login: String?, password: String?) { _data.value = NetworkResponse.Loading + var basic = Credentials.basic(login.toString(), password.toString()) viewModelScope.launch { - if(token != null) { + if(basic != "") { try { - val response = serviceApi.info(token) + val response = serviceApi.info(basic) if(response.isSuccessful) { response.body()?.let { _data.value = NetworkResponse.Success(it) diff --git a/app/src/main/java/com/example/nto_minipigs/ui/screens/QR/QRScreen.kt b/app/src/main/java/com/example/nto_minipigs/ui/screens/QR/QRScreen.kt index 5119bbb..e601003 100644 --- a/app/src/main/java/com/example/nto_minipigs/ui/screens/QR/QRScreen.kt +++ b/app/src/main/java/com/example/nto_minipigs/ui/screens/QR/QRScreen.kt @@ -14,15 +14,20 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView +import androidx.datastore.core.DataStore import androidx.navigation.NavController import com.example.nto_minipigs.QRResult +import com.example.nto_minipigs.UserData @Composable -fun QRScreen(navController: NavController, viewModel: QRViewModel) { +fun QRScreen(navController: NavController, viewModel: QRViewModel, dataStore: UserData) { var scanFlag by remember { mutableStateOf(false) } + val login = dataStore.getLogin() + val password = dataStore.getPassword() + AndroidView( factory = { context -> CompoundBarcodeView(context).apply { @@ -40,7 +45,8 @@ fun QRScreen(navController: NavController, viewModel: QRViewModel) { Log.d("penis", barCodeOrQr) scanFlag = true this.pause() - viewModel.Fetch(barCodeOrQr) + + viewModel.Fetch(barCodeOrQr, login, password) navController.navigate(QRResult) } //If you don't put this scanFlag = false, it will never work again. diff --git a/app/src/main/java/com/example/nto_minipigs/ui/screens/QR/QRViewModel.kt b/app/src/main/java/com/example/nto_minipigs/ui/screens/QR/QRViewModel.kt index 7078df3..8365433 100644 --- a/app/src/main/java/com/example/nto_minipigs/ui/screens/QR/QRViewModel.kt +++ b/app/src/main/java/com/example/nto_minipigs/ui/screens/QR/QRViewModel.kt @@ -4,11 +4,11 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.example.nto_minipigs.Retrofit.Models.Data +import com.example.nto_minipigs.Retrofit.Models.Auth import com.example.nto_minipigs.Retrofit.Models.Door import com.example.nto_minipigs.Retrofit.Models.DoorResponse -import com.example.nto_minipigs.Retrofit.Models.User import kotlinx.coroutines.launch +import okhttp3.Credentials class QRViewModel: ViewModel() { private val serviceApi = RetrofitClient.apiService @@ -16,14 +16,15 @@ class QRViewModel: ViewModel() { private val _data = MutableLiveData>() val data : LiveData> = _data - fun Fetch(id: String) { + fun Fetch(id: String, login:String, password:String) { _data.value = NetworkResponse.Loading viewModelScope.launch { if(id != null) { try { val request = Door(id) - val response = serviceApi.open(request) + var basic = Credentials.basic(login.toString(), password.toString()) + val response = serviceApi.open(basic, request) if(response.isSuccessful) { response.body()?.let { _data.value = NetworkResponse.Success(it)